Tất cả thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Độ tương đồng cosine

Đo mức giống nhau của hai vector theo góc giữa chúng, như cách công cụ tìm kiếm so sánh embedding.

Bạn sẽ học được gì

  • Đo độ tương đồng bằng góc
  • Tính tích vô hướng và độ dài vector
  • Hiểu cách tìm kiếm ngữ nghĩa so sánh văn bản

Đề bài

Xem bản gốc (English)

Độ tương đồng cosine so sánh hướng của hai vector và bỏ qua độ dài của chúng. Tìm kiếm ngữ nghĩa dùng nó để tìm các văn bản có embedding giống nhau:

cos(a, b) = (a · b) / (|a| × |b|), với |a| = √(a₁² + a₂² + … + aₙ²)

Kết quả bằng 1 khi cùng hướng, 0 khi vuông góc và -1 khi ngược hướng. Nếu một trong hai vector toàn số 0, trả về 0.

Hãy cài đặt cosine_similarity(a, b).

Đầu vào

a, b: Hai danh sách số có cùng độ dài.

Đầu ra

Trả về độ tương đồng cosine dưới dạng số thực.

Ràng buộc

1 ≤ độ dài ≤ 1.000

-1.000 ≤ mỗi giá trị ≤ 1.000

Ví dụ

Ví dụ 1
Đầu vào:
a = [1.0, 0.0]
b = [0.0, 1.0]

Kết quả mong đợi:
expected = 0.0
Đầu vào:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};

Kết quả mong đợi:
double expected = 0.0;
Đầu vào:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};

Kết quả mong đợi:
double expected = 0.0;

Giải thích

Tích vô hướng bằng 0, nên hai vector vuông góc và độ tương đồng bằng 0.

Ví dụ 2
Đầu vào:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]

Kết quả mong đợi:
expected = 1.0
Đầu vào:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};

Kết quả mong đợi:
double expected = 1.0;
Đầu vào:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};

Kết quả mong đợi:
double expected = 1.0;

Giải thích

b bằng a nhân 2: cùng hướng, nên độ tương đồng bằng 1 dù độ dài khác nhau.

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.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.