โจทย์ทั้งหมด
ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ความคล้ายคลึงโคไซน์

วัดว่าเวกเตอร์สองตัวคล้ายกันแค่ไหนจากมุมระหว่างกัน แบบเดียวกับที่เสิร์ชเอนจินเปรียบเทียบ embedding

สิ่งที่คุณจะได้เรียนรู้

  • วัดความคล้ายจากมุม
  • คำนวณผลคูณจุดและขนาดเวกเตอร์
  • เข้าใจว่าการค้นหาเชิงความหมายเปรียบเทียบข้อความอย่างไร

โจทย์

ความคล้ายคลึงโคไซน์ เปรียบเทียบทิศทางของเวกเตอร์สองตัวโดยไม่สนใจความยาว การค้นหาเชิงความหมายใช้วิธีนี้หาข้อความที่มี 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

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
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

ตัวอย่างที่ 2
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

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

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

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