在 JavaScript 中实现 K 近邻算法

Beginner

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

简介

在本实验中,我们将探索 K 近邻算法,这是一种用于对数据点进行分类的强大工具。通过在 JavaScript 中实现此算法,我们将能够根据新数据点与现有标记数据点的接近程度对其进行分类,使其成为各种应用(如推荐系统和图像识别)的宝贵工具。通过本实验,我们将更深入地了解机器学习算法的工作原理以及它们如何在实际场景中实现。

K 近邻算法

若要使用 K 近邻算法,请遵循以下步骤:

  1. 打开终端/SSH 并输入node
  2. 使用K 近邻算法相对于已标记数据集对一个数据点进行分类。
  3. 使用Array.prototype.map()data映射到对象。每个对象都包含该元素与point之间的欧几里得距离(使用Math.hypot()Object.keys()计算得出)及其label
  4. 使用Array.prototype.sort()Array.prototype.slice()获取pointk个最近邻。
  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 中练习更多实验来提升你的技能。