JavaScript での K 近傍法の実装

JavaScriptJavaScriptBeginner
オンラインで実践に進む

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、データポイントの分類に強力なツールである K 近傍法(K-Nearest Neighbors algorithm)を検討します。このアルゴリズムを JavaScript で実装することで、新しいデータポイントを既存のラベル付きデータポイントとの近さに基づいて分類することができます。これは、推薦システムや画像認識など、さまざまなアプリケーションにとって価値のあるツールになります。この実験を通じて、機械学習アルゴリズムがどのように機能するか、また現実世界のシナリオでどのように実装できるかを深く理解することができます。

K 近傍法(K-Nearest Neighbors Algorithm)

K 近傍法を使用するには、次の手順に従います。

  1. ターミナル/SSH を開き、node と入力します。
  2. k 近傍法を使用して、ラベル付きデータセットに対するデータポイントを分類します。
  3. Array.prototype.map() を使用して、data をオブジェクトにマッピングします。各オブジェクトには、Math.hypot()Object.keys() を使用して計算された、要素から point までのユークリッド距離とその label が含まれます。
  4. Array.prototype.sort()Array.prototype.slice() を使用して、point の最も近い k 個の近傍を取得します。
  5. Array.prototype.reduce()Object.keys()Array.prototype.indexOf() と組み合わせて使用して、それらの中で最も頻繁な label を見つけます。

以下は、K 近傍法を実装したコードの例です。

const kNearestNeighbors = (data, labels, point, k = 3) => {
  const kNearest = data
    .map((el, i) => ({
      dist: Math.hypot(...Object.keys(el).map((key) => point[key] - el[key])),
      label: labels[i]
    }))
    .sort((a, b) => a.dist - b.dist)
    .slice(0, k);

  return kNearest.reduce(
    (acc, { label }, i) => {
      acc.classCounts[label] =
        Object.keys(acc.classCounts).indexOf(label) !== -1
          ? acc.classCounts[label] + 1
          : 1;
      if (acc.classCounts[label] > acc.topClassCount) {
        acc.topClassCount = acc.classCounts[label];
        acc.topClass = label;
      }
      return acc;
    },
    {
      classCounts: {},
      topClass: kNearest[0].label,
      topClassCount: 0
    }
  ).topClass;
};

このコードの使い方は以下の通りです。

const data = [
  [0, 0],
  [0, 1],
  [1, 3],
  [2, 0]
];
const labels = [0, 1, 1, 0];

kNearestNeighbors(data, labels, [1, 2], 2); // 1
kNearestNeighbors(data, labels, [1, 0], 2); // 0

まとめ

おめでとうございます!あなたは K 近傍法の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習することができます。