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ụ
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ả.
- Đổi đầu vào hoặc trọng số và đoán kết quả trước khi chạy.
- In các giá trị trung gian để theo dõi từng bước tính toán.
- Giải các thử thách được liên kết bên dưới để tự cài đặt ý tưởng.
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ươ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. Dễ
- Phân cụm K-means Chia các điểm thành k cụm bằng cách lặp lại việc gán điểm vào tâm cụm gần nhất và dời tâm cụm. Trung bình