โจทย์ทั้งหมด
ปานกลาง 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) อีกสองจุดถัดไปคือ (4, 0) และ (0, 4) อยู่ห่างเท่ากัน จึงเลือกจุดที่ดัชนีน้อยกว่าคือ (4, 0) (blue) red และ blue ได้คนละหนึ่งเสียง และจุดของ red มาก่อน ดังนั้นคำตอบคือ red

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก