Implementierung von K-Nearest Neighbors in JavaScript

Beginner

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

Einführung

In diesem Lab werden wir den K-Nearest-Neighbors-Algorithmus erkunden, ein leistungsstarkes Tool zur Klassifizierung von Datenpunkten. Indem wir diesen Algorithmus in JavaScript implementieren, werden wir in der Lage sein, neue Datenpunkte zu klassifizieren, basierend auf ihrer Nähe zu vorhandenen markierten Datenpunkten, was ihn zu einem wertvollen Tool für eine Vielzahl von Anwendungen wie Empfehlungssystemen und Bilderkennung macht. Durch dieses Lab werden wir ein tieferes Verständnis dafür gewinnen, wie maschinelle Lernalgorithmen funktionieren und wie sie in realen Szenarien implementiert werden können.

K-Nearest-Neighbors-Algorithmus

Um den K-Nearest-Neighbors-Algorithmus zu verwenden, führen Sie die folgenden Schritte aus:

  1. Öffnen Sie das Terminal/SSH und geben Sie node ein.
  2. Klassifizieren Sie einen Datenpunkt relativ zu einem markierten Datensatz mit dem k-nearest neighbors-Algorithmus.
  3. Abbilden Sie die data auf Objekte mit Array.prototype.map(). Jedes Objekt enthält die euklidische Entfernung des Elements von point, berechnet mit Math.hypot(), Object.keys() und seinem label.
  4. Verwenden Sie Array.prototype.sort() und Array.prototype.slice(), um die k nächsten Nachbarn von point zu erhalten.
  5. Verwenden Sie Array.prototype.reduce() in Kombination mit Object.keys() und Array.prototype.indexOf(), um das am häufigsten vorkommende label unter ihnen zu finden.

Hier ist ein Beispielcode, der den K-Nearest-Neighbors-Algorithmus implementiert:

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;
};

So verwenden Sie den Code:

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

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das K-Nearest-Neighbors-Lab abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.