โจทย์
ความคล้ายคลึงโคไซน์ เปรียบเทียบทิศทางของเวกเตอร์สองตัวโดยไม่สนใจความยาว การค้นหาเชิงความหมายใช้วิธีนี้หาข้อความที่มี embedding คล้ายกัน:
cos(a, b) = (a · b) / (|a| × |b|) โดย |a| = √(a₁² + a₂² + … + aₙ²)
ผลลัพธ์เป็น 1 เมื่อทิศทางเดียวกัน 0 เมื่อตั้งฉากกัน และ -1 เมื่อทิศทางตรงข้าม ถ้าเวกเตอร์ตัวใดเป็นศูนย์ทั้งหมด ให้คืนค่า 0
จงเขียน cosine_similarity(a, b)
อินพุต
a, b: ลิสต์ตัวเลขสองลิสต์ที่มีความยาวเท่ากัน
เอาต์พุต
คืนค่าความคล้ายคลึงโคไซน์เป็นเลขทศนิยม
เงื่อนไข
1 ≤ ความยาว ≤ 1,000
-1,000 ≤ แต่ละค่า ≤ 1,000
ตัวอย่าง
อินพุต:
a = [1.0, 0.0]
b = [0.0, 1.0]
ผลลัพธ์ที่คาดหวัง:
expected = 0.0
อินพุต:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.0;
อินพุต:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 0.0;
คำอธิบาย
ผลคูณจุดเป็น 0 ดังนั้นเวกเตอร์ทั้งสองตั้งฉากกันและความคล้ายคลึงเป็น 0
อินพุต:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
ผลลัพธ์ที่คาดหวัง:
expected = 1.0
อินพุต:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 1.0;
อินพุต:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
ผลลัพธ์ที่คาดหวัง:
double expected = 1.0;
คำอธิบาย
b คือ a คูณ 2: ทิศทางเดียวกัน ดังนั้นความคล้ายคลึงเป็น 1 แม้ความยาวต่างกัน
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน