Alle Herausforderungen
Mittel 0 gelöst 0% Erfolgsquote

K-Nächste-Nachbarn-Klassifikator

Sage ein Label per Mehrheitsentscheid der k nächstgelegenen Trainingspunkte voraus.

Das lernst du

  • Die nächsten Trainingspunkte finden
  • Per Mehrheitsentscheid vorhersagen
  • Gleichstände deterministisch auflösen

Problem

K-nächste Nachbarn (KNN) klassifiziert einen neuen Punkt, indem es die k Trainingspunkte betrachtet, die ihm am nächsten liegen, und das häufigste Label nimmt.

  1. Berechne den euklidischen Abstand von query zu jedem Punkt.
  2. Sortiere die Punkte nach Abstand; bei gleichen Abständen kommt der Punkt mit dem kleineren Index zuerst.
  3. Nimm die ersten k Punkte und zähle ihre Labels.
  4. Gib das Label mit den meisten Stimmen zurück. Bei Gleichstand gib das Label zurück, dessen nächster Punkt in der sortierten Reihenfolge zuerst kommt.

Implementiere knn_predict(points, labels, query, k).

Eingabe

points: Die Trainingspunkte, jeweils eine Liste von Koordinaten.

labels: Das Label jedes Punkts.

query: Der zu klassifizierende Punkt.

k: Wie viele Nachbarn abstimmen.

Ausgabe

Gib das vorhergesagte Label zurück.

Einschränkungen

1 ≤ k ≤ Anzahl der Punkte ≤ 1.000

1 ≤ Dimensionen ≤ 20

-1.000 ≤ jede Koordinate ≤ 1.000

Beispiele

Beispiel 1
Eingabe:
k = 3
query = [3.0, 3.0]
labels = ["A", "A", "B", "B"]
points = [
    [1.0, 1.0],
    [2.0, 2.0],
    [8.0, 8.0],
    [9.0, 9.0]
]

Erwartete Ausgabe:
expected = "A"
Eingabe:
long long k = 3;
std::vector<double> query = {3.0, 3.0};
std::vector<std::string> labels = {"A", "A", "B", "B"};
std::vector<std::vector<double>> points = {
    {1.0, 1.0},
    {2.0, 2.0},
    {8.0, 8.0},
    {9.0, 9.0}
};

Erwartete Ausgabe:
std::string expected = "A";
Eingabe:
long k = 3;
double[] query = new double[] {3.0, 3.0};
string[] labels = new string[] {"A", "A", "B", "B"};
double[][] points = new double[][] {
    new double[] {1.0, 1.0},
    new double[] {2.0, 2.0},
    new double[] {8.0, 8.0},
    new double[] {9.0, 9.0}
};

Erwartete Ausgabe:
string expected = "A";

Erläuterung

Abstände von (3, 3): (2, 2) ≈ 1.41, (1, 1) ≈ 2.83, (8, 8) ≈ 7.07. Die 3 nächsten Labels sind A, A und B, also ist die Antwort A.

Beispiel 2
Eingabe:
k = 2
query = [1.0, 1.0]
labels = ["red", "blue", "blue", "red"]
points = [
    [0.0, 0.0],
    [4.0, 0.0],
    [0.0, 4.0],
    [4.0, 4.0]
]

Erwartete Ausgabe:
expected = "red"
Eingabe:
long long k = 2;
std::vector<double> query = {1.0, 1.0};
std::vector<std::string> labels = {"red", "blue", "blue", "red"};
std::vector<std::vector<double>> points = {
    {0.0, 0.0},
    {4.0, 0.0},
    {0.0, 4.0},
    {4.0, 4.0}
};

Erwartete Ausgabe:
std::string expected = "red";
Eingabe:
long k = 2;
double[] query = new double[] {1.0, 1.0};
string[] labels = new string[] {"red", "blue", "blue", "red"};
double[][] points = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {4.0, 0.0},
    new double[] {0.0, 4.0},
    new double[] {4.0, 4.0}
};

Erwartete Ausgabe:
string expected = "red";

Erläuterung

Der nächste Punkt ist (0, 0) (red); die nächsten beiden, (4, 0) und (0, 4), haben denselben Abstand, also gewinnt der kleinere Index (4, 0) (blue). Red und blue haben je eine Stimme, und der Punkt von red kam zuerst, also ist die Antwort red.

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.