Tất cả thử thách
Trung bình 0 đã giải Tỷ lệ chấp nhận 0%

Bộ phân loại K láng giềng gần nhất

Dự đoán nhãn bằng cách bỏ phiếu đa số trong k điểm huấn luyện gần nhất.

Bạn sẽ học được gì

  • Tìm các điểm huấn luyện gần nhất
  • Dự đoán bằng bỏ phiếu đa số
  • Xử lý hòa phiếu một cách xác định

Đề bài

Xem bản gốc (English)

K láng giềng gần nhất (KNN) phân loại một điểm mới bằng cách xét k điểm huấn luyện gần nó nhất và lấy nhãn phổ biến nhất.

  1. Tính khoảng cách Euclid từ query đến mọi điểm.
  2. Sắp xếp các điểm theo khoảng cách; nếu hai khoảng cách bằng nhau, điểm có chỉ số nhỏ hơn đứng trước.
  3. Lấy k điểm đầu tiên và đếm nhãn của chúng.
  4. Trả về nhãn có nhiều phiếu nhất. Nếu các nhãn hòa nhau, trả về nhãn có điểm gần nhất đứng trước trong thứ tự đã sắp xếp.

Hãy cài đặt knn_predict(points, labels, query, k).

Đầu vào

points: Các điểm huấn luyện, mỗi điểm là một danh sách tọa độ.

labels: Nhãn của từng điểm.

query: Điểm cần phân loại.

k: Số láng giềng được bỏ phiếu.

Đầu ra

Trả về nhãn dự đoán.

Ràng buộc

1 ≤ k ≤ số điểm ≤ 1.000

1 ≤ số chiều ≤ 20

-1.000 ≤ mỗi tọa độ ≤ 1.000

Ví dụ

Ví dụ 1
Đầu vào:
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]
]

Kết quả mong đợi:
expected = "A"
Đầu vào:
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}
};

Kết quả mong đợi:
std::string expected = "A";
Đầu vào:
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}
};

Kết quả mong đợi:
string expected = "A";

Giải thích

Khoảng cách từ (3, 3): (2, 2) ≈ 1.41, (1, 1) ≈ 2.83, (8, 8) ≈ 7.07. 3 nhãn gần nhất là A, A và B, nên đáp án là A.

Ví dụ 2
Đầu vào:
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]
]

Kết quả mong đợi:
expected = "red"
Đầu vào:
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}
};

Kết quả mong đợi:
std::string expected = "red";
Đầu vào:
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}
};

Kết quả mong đợi:
string expected = "red";

Giải thích

Điểm gần nhất là (0, 0) (red); hai điểm tiếp theo, (4, 0) và (0, 4), có cùng khoảng cách, nên điểm có chỉ số nhỏ hơn là (4, 0) (blue) được chọn. Red và blue mỗi bên một phiếu, và điểm của red đứng trước, nên đáp án là red.

Tham khảo

Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.