Khái niệm AI với Python

Cosine similarity và phân cụm k-means trong Python

Học không giám sát tìm cấu trúc trong dữ liệu không có nhãn. Cosine similarity đo hai vector giống nhau đến đâu, còn k-means gom các điểm thành cụm quanh những tâm mà nó tự học.

Khái niệm bằng lời đơn giản

Học không giám sát tìm cấu trúc trong dữ liệu không có nhãn. Cosine similarity đo hai vector giống nhau đến đâu, còn k-means gom các điểm thành cụm quanh những tâm mà nó tự học.

Đo mức giống nhau của hai vector bằng cosine similarity và gom nhóm dữ liệu không nhãn bằng k-means.

Ý chính

  • Cosine similarity bỏ qua độ dài và chỉ so sánh hướng, phù hợp với văn bản và embedding.
  • k-means cần biết trước số cụm k.
  • Tâm ban đầu có thể làm thay đổi kết quả, nên k-means thường được chạy nhiều lần.
  • Các cụm được tìm chỉ từ dữ liệu, không cần nhãn.

Khi nào nên sử dụng?

  • Hiểu điều gì diễn ra bên trong mạng nơ-ron và các thư viện AI.
  • Nắm ý tưởng trước khi tự cài đặt nó trong các thử thách tương ứng.
  • Chuẩn bị cho khóa học machine learning, phỏng vấn và dự án.

Xem trực quan

Nhấn Từng bước để luân phiên hai bước của k-means, hoặc Phát để chạy tới khi không còn thay đổi. Xoay các vector bên phải để đổi cosine similarity.

Code ví dụ

Chạy code →
main.py
import math

# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))

print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))

# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
    groups = [[], []]
    for p in points:
        nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
        groups[nearest].append(p)
    centres = [sum(g) / len(g) for g in groups]
    print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")

Kết quả dự kiến

cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]

Cách hoạt động

cosine() chia tích vô hướng cho độ dài của cả hai vector, nên doc2 (cùng hướng với doc1) được 1 điểm và doc3 (không có từ chung) được 0. k-means lặp lại hai bước, gán mỗi điểm vào tâm gần nhất rồi dời mỗi tâm về trung bình các điểm của nó. Sau bước 2 không còn gì thay đổi, tức là đã hội tụ.

Thay đổi giá trị và chạy chương trình bằng trình chạy Python online của CodeUtility mà không cần cài Python.

Bài tập mở rộng

Hãy sửa code theo các bài tập dưới đây để hiểu rõ cách hoạt động thay vì chỉ sao chép kết quả.

  1. Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
  2. In các giá trị trung gian để theo dõi từng bước tính toán.
  3. Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
Chạy trong Python IDE →

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách