Tous les défis
Moyen 0 résolus 0 % de réussite

Classifieur des k plus proches voisins

Prédisez une étiquette par vote majoritaire des k points d'entraînement les plus proches.

Ce que vous allez apprendre

  • Trouver les points d'entraînement les plus proches
  • Prédire par vote majoritaire
  • Départager les égalités de façon déterministe

Problème

Les k plus proches voisins (KNN) classent un nouveau point en regardant les k points d'entraînement les plus proches et en prenant l'étiquette la plus fréquente.

  1. Calculez la distance euclidienne entre query et chaque point.
  2. Triez les points par distance ; si deux distances sont égales, le point d'indice le plus petit passe en premier.
  3. Prenez les k premiers points et comptez leurs étiquettes.
  4. Renvoyez l'étiquette qui a le plus de votes. En cas d'égalité, renvoyez l'étiquette dont le point le plus proche apparaît en premier dans l'ordre trié.

Implémentez knn_predict(points, labels, query, k).

Entrée

points : les points d'entraînement, chacun étant une liste de coordonnées.

labels : l'étiquette de chaque point.

query : le point à classer.

k : le nombre de voisins qui votent.

Sortie

Renvoyez l'étiquette prédite.

Contraintes

1 ≤ k ≤ nombre de points ≤ 1 000

1 ≤ dimensions ≤ 20

-1 000 ≤ chaque coordonnée ≤ 1 000

Exemples

Exemple 1
Entrée :
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]
]

Sortie attendue :
expected = "A"
Entrée :
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}
};

Sortie attendue :
std::string expected = "A";
Entrée :
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}
};

Sortie attendue :
string expected = "A";

Explication

Distances depuis (3, 3) : (2, 2) ≈ 1.41, (1, 1) ≈ 2.83, (8, 8) ≈ 7.07. Les 3 étiquettes les plus proches sont A, A et B, donc la réponse est A.

Exemple 2
Entrée :
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]
]

Sortie attendue :
expected = "red"
Entrée :
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}
};

Sortie attendue :
std::string expected = "red";
Entrée :
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}
};

Sortie attendue :
string expected = "red";

Explication

Le point le plus proche est (0, 0) (red) ; les deux suivants, (4, 0) et (0, 4), sont à la même distance, donc l'indice le plus petit, (4, 0) (blue), l'emporte. Red et blue ont chacun une voix, et le point de red est arrivé en premier, donc la réponse est red.

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.