在JavaScript中实现K近邻算法

JavaScriptJavaScriptBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL javascript(("`JavaScript`")) -.-> javascript/BasicConceptsGroup(["`Basic Concepts`"]) javascript(("`JavaScript`")) -.-> javascript/AdvancedConceptsGroup(["`Advanced Concepts`"]) javascript/BasicConceptsGroup -.-> javascript/variables("`Variables`") javascript/BasicConceptsGroup -.-> javascript/data_types("`Data Types`") javascript/BasicConceptsGroup -.-> javascript/arith_ops("`Arithmetic Operators`") javascript/BasicConceptsGroup -.-> javascript/comp_ops("`Comparison Operators`") javascript/BasicConceptsGroup -.-> javascript/cond_stmts("`Conditional Statements`") javascript/BasicConceptsGroup -.-> javascript/array_methods("`Array Methods`") javascript/BasicConceptsGroup -.-> javascript/obj_manip("`Object Manipulation`") javascript/AdvancedConceptsGroup -.-> javascript/higher_funcs("`Higher-Order Functions`") javascript/AdvancedConceptsGroup -.-> javascript/spread_rest("`Spread and Rest Operators`") subgraph Lab Skills javascript/variables -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/data_types -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/arith_ops -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/comp_ops -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/cond_stmts -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/array_methods -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/obj_manip -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/higher_funcs -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} javascript/spread_rest -.-> lab-28461{{"`在JavaScript中实现K近邻算法`"}} end

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中练习更多实验来提升你的技能。

您可能感兴趣的其他 JavaScript 教程