Đề bài
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.
- Tính khoảng cách Euclid từ
queryđến mọi điểm. - 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.
- Lấy k điểm đầu tiên và đếm nhãn của chúng.
- 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ụ
Đầ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.
Đầ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.