





📌 Phát hiện outlier bằng K-Means
K-Means không chỉ dùng để phân cụm mà còn có thể được tận dụng để phát hiện điểm bất thường (outlier detection) trong dữ liệu.
🔎 Ý tưởng chính
- Sau khi chạy K-Means, mỗi điểm dữ liệu sẽ được gán vào một cụm (cluster) với tâm cụm (centroid).
- Khoảng cách từ điểm đến tâm cụm phản ánh mức độ “điển hình” của điểm đó trong cụm.
- Outlier thường là những điểm có khoảng cách rất lớn so với tâm cụm hoặc nằm trong cụm có kích thước rất nhỏ.
⚙️ Các bước thực hiện
- Chạy K-Means để phân cụm dữ liệu thành (k) cụm.
- Tính khoảng cách từ mỗi điểm đến tâm cụm của nó.
- Xác định ngưỡng (threshold):
- Có thể chọn theo phần trăm (ví dụ: top 5% điểm xa nhất).
- Hoặc dựa trên thống kê (ví dụ: khoảng cách > 2 lần độ lệch chuẩn).
- Đánh dấu outlier: những điểm vượt ngưỡng được coi là bất thường.
🌍 Ứng dụng thực tế
- Tài chính: phát hiện giao dịch gian lận (outlier so với hành vi bình thường).
- An ninh mạng: phát hiện truy cập bất thường trong log hệ thống.
- Y tế: phát hiện bệnh nhân có chỉ số xét nghiệm bất thường.
- IoT/cảm biến: phát hiện lỗi thiết bị khi dữ liệu đo lệch khỏi cụm chính.
📌 Ví dụ minh họa
Giả sử ta có dữ liệu chiều cao và cân nặng của 1000 người.
- K-Means chia thành 3 cụm (nhóm người thấp – trung bình – cao).
- Một người có chiều cao 220 cm và cân nặng 40 kg → khoảng cách rất xa so với tâm cụm → được đánh dấu là outlier.
👉 Tóm lại: K-Means phát hiện outlier bằng cách đo khoảng cách điểm đến tâm cụm và so sánh với ngưỡng.
Đây là biểu đồ minh họa cách K-Means phát hiện outlier trong dữ liệu 2D. Các cụm chính được tô màu khác nhau, tâm cụm được đánh dấu bằng biểu tượng đen, và những điểm bất thường (outlier) được hiển thị bằng dấu X màu đỏ.

👉 Nhìn vào hình, bạn sẽ thấy rằng các điểm nằm xa tâm cụm bị đánh dấu là outlier. Đây chính là cách K-Means tận dụng khoảng cách để phát hiện dữ liệu bất thường.
🐍 Code minh họa K-Means Outlier Detection
📌 Các bước
- Tạo dữ liệu: gồm 2 cụm chính và vài điểm bất thường.
- KMeans: phân cụm dữ liệu thành 2 cụm.
- Khoảng cách: tính khoảng cách từ mỗi điểm đến tâm cụm.
- Ngưỡng: chọn top 5% điểm xa nhất làm outlier.
- Biểu đồ: hiển thị cụm, tâm cụm, và outlier bằng màu đỏ.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 1. Tạo dữ liệu giả lập (2 cụm chính + vài outlier)
np.random.seed(42)
cluster1 = np.random.normal(loc=[2, 2], scale=0.5, size=(50, 2))
cluster2 = np.random.normal(loc=[7, 7], scale=0.5, size=(50, 2))
outliers = np.array([[10, 10], [1, 8], [8, 1]]) # các điểm bất thường
X = np.vstack([cluster1, cluster2, outliers])
# 2. Áp dụng KMeans
kmeans = KMeans(n_clusters=2, random_state=42)
labels = kmeans.fit_predict(X)
centroids = kmeans.cluster_centers_
# 3. Tính khoảng cách từ mỗi điểm đến tâm cụm
distances = np.linalg.norm(X - centroids[labels], axis=1)
# 4. Xác định outlier (top 5% điểm xa nhất)
threshold = np.percentile(distances, 95)
outlier_mask = distances > threshold
# 5. Vẽ biểu đồ
plt.figure(figsize=(8, 6))
plt.scatter(X[~outlier_mask, 0], X[~outlier_mask, 1],
c=labels[~outlier_mask], cmap='viridis', s=50, label="Normal points")
plt.scatter(X[outlier_mask, 0], X[outlier_mask, 1],
c='red', marker='x', s=100, label="Outliers")
plt.scatter(centroids[:, 0], centroids[:, 1],
c='black', marker='D', s=200, label="Centroids")
plt.legend()
plt.title("K-Means Outlier Detection")
plt.show()
Discover more from Cùng Học Cùng Mơ
Subscribe to get the latest posts sent to your email.
