中級 0件解決済み 正答率0%

k近傍法による分類

最も近い k 個の学習点の多数決でラベルを予測します。

このチャレンジで学べること

  • 最も近い学習データを見つける
  • 多数決で予測する
  • 同数を決まった方法で解決する

問題

原文(英語)を表示

k近傍法(KNN)は、新しい点に最も近い k 個の学習点を見て、最も多いラベルで分類します。

  1. query からすべての点までのユークリッド距離を計算します。
  2. 点を距離順に並べます。距離が同じ場合は、インデックスが小さい点が先です。
  3. 先頭の k 個の点を取り、ラベルを数えます。
  4. 最も票の多いラベルを返します。同票の場合は、並べた順で最も近い点が先に来るラベルを返します。

knn_predict(points, labels, query, k) を実装してください。

入力

points: 学習点。各点は座標のリストです。

labels: 各点のラベル。

query: 分類する点。

k: 投票する近傍の数。

出力

予測したラベルを返してください。

制約

1 ≤ k ≤ 点の数 ≤ 1,000

1 ≤ 次元数 ≤ 20

-1,000 ≤ 各座標 ≤ 1,000

例

例 1
入力:
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]
]

期待される出力:
expected = "A"
入力:
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}
};

期待される出力:
std::string expected = "A";
入力:
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}
};

期待される出力:
string expected = "A";

解説

(3, 3) からの距離:(2, 2) ≈ 1.41、(1, 1) ≈ 2.83、(8, 8) ≈ 7.07。最も近い3つのラベルは A、A、B なので、答えは A です。

例 2
入力:
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]
]

期待される出力:
expected = "red"
入力:
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}
};

期待される出力:
std::string expected = "red";
入力:
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}
};

期待される出力:
string expected = "red";

解説

最も近い点は (0, 0)(red)です。次の2つ (4, 0) と (0, 4) は同じ距離なので、インデックスが小さい (4, 0)(blue)が選ばれます。red と blue が1票ずつで、red の点が先に来たので、答えは red です。

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。