โจทย์
K เพื่อนบ้านที่ใกล้ที่สุด (KNN) จำแนกจุดใหม่โดยดูจุดฝึก k จุดที่ใกล้ที่สุดแล้วเลือกป้ายกำกับที่พบบ่อยที่สุด
- คำนวณระยะทางแบบยุคลิดจาก
queryไปยังทุกจุด - เรียงจุดตามระยะทาง ถ้าระยะทางเท่ากัน จุดที่มีดัชนีน้อยกว่าจะมาก่อน
- เลือก k จุดแรกแล้วนับป้ายกำกับ
- คืนค่าป้ายกำกับที่ได้เสียงมากที่สุด ถ้าเสมอกัน ให้คืนค่าป้ายกำกับที่จุดซึ่งใกล้ที่สุดของมันมาก่อนในลำดับที่เรียงแล้ว
จงเขียน knn_predict(points, labels, query, k)
อินพุต
points: จุดฝึก แต่ละจุดเป็นลิสต์ของพิกัด
labels: ป้ายกำกับของแต่ละจุด
query: จุดที่ต้องการจำแนก
k: จำนวนเพื่อนบ้านที่ร่วมโหวต
เอาต์พุต
คืนค่าป้ายกำกับที่ทำนายได้
เงื่อนไข
1 ≤ k ≤ จำนวนจุด ≤ 1,000
1 ≤ จำนวนมิติ ≤ 20
-1,000 ≤ แต่ละพิกัด ≤ 1,000
ตัวอย่าง
อินพุต:
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
อินพุต:
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) อีกสองจุดถัดไปคือ (4, 0) และ (0, 4) อยู่ห่างเท่ากัน จึงเลือกจุดที่ดัชนีน้อยกว่าคือ (4, 0) (blue) red และ blue ได้คนละหนึ่งเสียง และจุดของ red มาก่อน ดังนั้นคำตอบคือ red
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน