











K-Means là một thuật toán phân cụm phổ biến, nhưng để áp dụng hiệu quả cần chú ý một số điểm quan trọng:
🔎 Các lưu ý chính
- Chọn số cụm (k):
- K-Means yêu cầu xác định trước số cụm.
- Nếu chọn sai (k), kết quả phân cụm sẽ không phản ánh đúng cấu trúc dữ liệu.
- Thường dùng các phương pháp như Elbow Method, Silhouette Score để chọn (k).
- Nhạy cảm với điểm khởi tạo (initialization):
- Kết quả có thể khác nhau nếu chọn tâm cụm ban đầu khác nhau.
- Giải pháp: dùng K-Means++ để chọn tâm cụm khởi tạo thông minh hơn.
- Nhạy cảm với outlier:
- Outlier có thể kéo tâm cụm lệch xa, làm giảm chất lượng phân cụm.
- Nên loại bỏ hoặc xử lý outlier trước khi chạy K-Means.
- Giả định cụm có dạng cầu (spherical clusters):
- K-Means hoạt động tốt khi cụm có dạng tròn và kích thước tương tự.
- Nếu cụm có hình dạng phức tạp (ví dụ: hình chữ U, xoắn ốc), K-Means sẽ không phân cụm chính xác.
- Yêu cầu chuẩn hóa dữ liệu:
- Nếu các đặc trưng có thang đo khác nhau (ví dụ: chiều cao tính bằng cm, cân nặng tính bằng kg), cần chuẩn hóa (standardization) để tránh đặc trưng lớn chi phối khoảng cách.
- Không đảm bảo tối ưu toàn cục:
- K-Means chỉ tìm nghiệm tối ưu cục bộ.
- Nên chạy nhiều lần với khởi tạo khác nhau để chọn kết quả tốt nhất.
- Kích thước dữ liệu lớn:
- Với dữ liệu rất lớn, K-Means có thể tốn thời gian.
- Có thể dùng Mini-Batch K-Means để tăng tốc.
🌍 Tóm lại
K-Means dễ dùng và hiệu quả, nhưng cần:
- Chọn số cụm hợp lý,
- Chuẩn hóa dữ liệu,
- Xử lý outlier,
- Và kiểm tra nhiều lần để tránh tối ưu cục bộ.
Đây là biểu đồ Elbow Method minh họa cách chọn số cụm (k) trong K-Means. Điểm “khuỷu tay” (elbow) trên đường cong cho thấy giá trị (k) hợp lý nhất – thường là nơi inertia giảm mạnh rồi bắt đầu chậm lại.

👉 Trong ví dụ này, bạn sẽ thấy đường cong giảm nhanh từ (k=1) đến (k=3), sau đó chậm lại. Điều đó gợi ý rằng (k=3) là số cụm tối ưu cho dữ liệu giả lập. Đây chính là cách thực tế để chọn số cụm khi dùng K-Means.
Dưới đây là code Python minh họa cách dùng Elbow Method để chọn số cụm (k) trong K-Means. Bạn có thể chạy trực tiếp với scikit-learn và matplotlib:
📌 Các bước
- make_blobs: tạo dữ liệu giả lập với 3 cụm.
- inertia: đo độ chặt của cụm (càng nhỏ càng tốt).
- Elbow Method: chọn (k) tại điểm “khuỷu tay” – nơi inertia giảm mạnh rồi bắt đầu chậm lại.
👉 Khi chạy code này, bạn sẽ thấy đường cong giảm nhanh từ (k=1) đến (k=3), sau đó chậm lại → gợi ý rằng (k=3) là số cụm hợp lý.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 1. Tạo dữ liệu giả lập gồm 3 cụm
X, y = make_blobs(n_samples=500, centers=3, cluster_std=0.6, random_state=42)
# 2. Tính inertia (tổng bình phương khoảng cách) cho k từ 1 đến 10
inertias = []
K_range = range(1, 11)
for k in K_range:
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
inertias.append(kmeans.inertia_)
# 3. Vẽ biểu đồ Elbow
plt.figure(figsize=(8, 6))
plt.plot(K_range, inertias, 'bo-')
plt.xlabel("Số cụm k")
plt.ylabel("Inertia (Tổng bình phương khoảng cách)")
plt.title("Elbow Method để chọn số cụm K")
plt.xticks(K_range)
plt.grid(True)
plt.show()
Discover more from Cùng Học Cùng Mơ
Subscribe to get the latest posts sent to your email.
