Chuyển đến nội dung chính

Điểm Silhouette: Cách đánh giá chất lượng phân cụm

Hướng dẫn thực hành về điểm silhouette, bao gồm công thức, các mức diễn giải, ví dụ scikit-learn, cách dùng để chọn số cụm phù hợp, và so sánh với các thước đo phân cụm khác.
Đã cập nhật 31 thg 7, 2026  · 12 phút đọc

Khám phá với AI

Mở trong ChatGPTMở trong ClaudeMở trong Perplexity

Sau khi bạn huấn luyện một mô hình phân cụm, làm sao biết được các cụm có tốt không?

Không có câu trả lời chung cho mọi trường hợp. Trong học có giám sát truyền thống, bạn có thể so sánh dự đoán với nhãn thực và nhận được một con số độ chính xác. Với phân cụm thì không thể. Bạn đã chọn k=5, nhưng liệu một giá trị k khác có tốt hơn không? Không có nhãn, bạn không thể biết thuật toán đã tìm ra cấu trúc thật sự hay chỉ chia dữ liệu thành các phần ngẫu nhiên.

Điểm silhouette là thước đo bạn đang cần. Nó cho biết mỗi điểm phù hợp với cụm được gán như thế nào so với cụm gần nhất tiếp theo, và là một trong những thước đo được dùng rộng rãi nhất. Nó hoạt động không cần nhãn và dễ diễn giải.

Trong bài viết này, tôi sẽ hướng dẫn bạn công thức và cách đọc, đưa ra ví dụ Python với scikit-learn, và bàn về các trường hợp khi nào nên và không nên dùng nó như một giải pháp tối ưu.

Bạn mới làm quen với phân cụm? Hãy đọc hướng dẫn Giới thiệu về phân cụm k-Means với scikit-learn để tìm hiểu cách thuật toán hoạt động và cách dùng trong Python. 

Điểm Silhouette là gì?

Điểm silhouette là một số từ -1 đến 1 cho biết mỗi điểm phù hợp với cụm của nó đến mức nào.

Con số này thể hiện hai điều:

  1. Một điểm gần các điểm khác trong cùng cụm của nó đến mức nào
  2. Nó cách cụm gần nhất mà nó không thuộc về bao xa

Nếu điểm nằm sâu trong nhóm của nó và cách xa mọi nhóm khác, điểm số sẽ cao. Nếu nó ở rìa, gần cụm láng giềng hơn là cụm của chính nó, điểm số sẽ thấp.

Tóm lại, đó là sự cân bằng mà điểm silhouette thể hiện. Nó bao gồm cả mức độ các điểm gom chặt trong mỗi cụm và mức độ tách biệt giữa các cụm. Cả hai đều quan trọng như nhau. Một phép phân cụm gom điểm tốt nhưng đặt các cụm chồng lên nhau thì không hữu ích, và phân cụm tách các cụm tốt nhưng các điểm bên trong rời rạc cũng vậy.

Well-separated clusters compared with overlapping clusters

Các cụm tách biệt tốt so với các cụm chồng lấn

Điểm số cao nghĩa là các cụm được xác định rõ. Điểm gần 1 nghĩa là các điểm nằm chặt trong cụm và cách xa cụm khác. Điểm gần 0 nghĩa là các cụm chồng lấn hoặc ranh giới mơ hồ. Điểm âm nghĩa là điểm gần một cụm khác hơn cụm được gán.

Điểm Silhouette hoạt động như thế nào?

Mỗi điểm có điểm silhouette riêng, và điểm đó xuất phát từ hai khoảng cách.

Thứ nhất là khoảng cách trung bình từ điểm đến các điểm khác trong cụm được gán. Nếu nhỏ, điểm ở gần các điểm khác trong cụm. Nếu lớn, điểm gắn với cụm một cách lỏng lẻo.

Thứ hai là khoảng cách trung bình từ điểm đến các điểm trong cụm láng giềng gần nhất. Nếu lớn, điểm tách rõ khỏi các cụm khác. Nếu nhỏ, điểm gần ranh giới.

Distance of a point to the clusters

Khoảng cách của một điểm đến các cụm

Giá trị silhouette so sánh hai con số này. Một điểm nằm sâu trong cụm của nó và cách xa mọi cụm khác sẽ có điểm cao. Một điểm ở rìa (gần cụm khác) sẽ có điểm thấp. Một điểm gần cụm khác hơn cụm của nó sẽ có điểm âm.

Điều cần nhớ là từng khoảng cách riêng lẻ đều không đủ. 

Một cụm chặt có thể nằm sát ngay cạnh cụm khác. Một cụm tách biệt tốt có thể bị phân tán bên trong. Bạn cần cả hai khoảng cách để tin tưởng việc gán cụm.

Công thức điểm Silhouette

Đây là công thức cho một điểm đơn lẻ:

Silhouette score formula

Công thức điểm silhouette

Trong đó:

  • a là khoảng cách trung bình từ điểm đến tất cả điểm khác trong cùng cụm

  • b là khoảng cách trung bình từ điểm đến tất cả điểm trong cụm láng giềng gần nhất

Công thức chia khoảng cách chênh lệch giữa ba cho giá trị lớn hơn trong hai giá trị đó. 

Nói chung, bạn có thể dùng các hướng dẫn sau để diễn giải điểm số:

  • Khi b lớn hơn nhiều so với a: Điểm cách xa mọi cụm khác và gần cụm của nó. Tử số gần bằng b, mẫu số cũng là b, và điểm số gần 1

  • Khi a lớn hơn nhiều so với b: Điểm gần một cụm khác hơn cụm của nó. Tử số là một số âm lớn gần với -a, mẫu số là a, và điểm số gần -1

  • Khi ab xấp xỉ nhau: Điểm nằm trên ranh giới giữa hai cụm. Tử số gần 0, và điểm số cũng vậy

Chi tiết cụ thể ở phần tiếp theo.

Cách diễn giải điểm Silhouette

Đây là hướng dẫn sơ bộ để đọc điểm silhouette:

  • Gần 1: Các điểm nằm sâu trong cụm của chúng và cách xa cụm khác
  • Khoảng 0,7: Phân cụm tốt, các nhóm tách biệt và các điểm gần các điểm khác trong cụm
  • Khoảng 0,5: Phân cụm hợp lý, có một chút chồng lấn giữa các cụm nhưng vẫn phân biệt được
  • Gần 0: Các cụm chồng lấn hoặc ranh giới không rõ ràng. Cấu trúc có thể không thật sự tồn tại
  • Dưới 0: Các điểm gần cụm không đúng hơn. Điều này có thể xảy ra khi bạn chọn sai số cụm hoặc dữ liệu vốn dĩ không phân cụm tốt.

Các ngưỡng trên chỉ là hướng dẫn sơ bộ. Thế nào là điểm silhouette tốt còn phụ thuộc vào bộ dữ liệu.

Dữ liệu thưa và nhiều chiều thường cho điểm thấp hơn ngay cả khi các cụm tốt. Dữ liệu dày đặc, tách biệt tốt có thể cho điểm trên 0,7. Bạn nên so sánh điểm giữa các mô hình trên cùng một bộ dữ liệu, không so với một ngưỡng chung.

Cách tính điểm Silhouette

Bạn tính điểm silhouette cho từng điểm một. Đây là cách thực hiện cho một điểm.

Bước 1: Tính a, khoảng cách trung bình từ điểm đến mọi điểm khác trong cụm của nó. Nếu điểm nằm trong một cụm có 4 điểm khác, và khoảng cách đến các điểm đó là 1.2, 1.5, 1.0 và 1.3:

Silhouette score calculation (1)

Tính điểm silhouette (1)

Bước 2: Tìm cụm láng giềng gần nhất (cụm khác với cụm của điểm có khoảng cách trung bình từ điểm là nhỏ nhất). Sau đó tính b, khoảng cách trung bình từ điểm đến mọi điểm trong cụm đó. Nếu cụm gần nhất có 5 điểm với khoảng cách 2.4, 2.8, 3.0, 2.6 và 2.7:

Silhouette score calculation (2)

Tính điểm silhouette (2)

Bước 3: Thay ab vào công thức:

Silhouette score calculation (3)

Tính điểm silhouette (3)

Bước 4: Lặp lại cho mọi điểm trong bộ dữ liệu. Điểm silhouette tổng thể cho phân cụm là trung bình của điểm số các điểm.

Ví dụ điểm Silhouette trong Python

Scikit-learn cung cấp hai hàm để tính điểm silhouette, đều nằm trong sklearn.metrics:

  • silhouette_score() trả về điểm trung bình cho toàn bộ phân cụm

  • silhouette_samples() trả về điểm số cho từng điểm riêng lẻ

Cách dùng chúng với KMeans trên một bộ dữ liệu tổng hợp như sau:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, silhouette_samples

# Synthetic data with 4 clusters
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Clustering model
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)

# Overall silhouette score
score = silhouette_score(X, labels)
print(f"Overall silhouette score: {score:.3f}")

# Per-point silhouette values
sample_scores = silhouette_samples(X, labels)
print(f"First 5 point scores: {sample_scores[:5]}")

Bạn sẽ nhận được đầu ra này khi chạy đoạn mã trên:

Python example output

Đầu ra ví dụ Python

Điểm tổng thể 0,791 nghĩa là bốn cụm được xác định và tách biệt tốt.

Các điểm số theo từng điểm cho phép bạn phân tích từng điểm dữ liệu. 

Các điểm có điểm số cá nhân cao nằm sâu trong cụm của chúng. Các điểm có điểm thấp hoặc âm nằm trên ranh giới hoặc bị gán sai, điều này hữu ích để phát hiện ngoại lệ hoặc xem lại các điểm ranh giới.

Chọn số cụm tối ưu

Một trong những cách dùng phổ biến nhất của điểm silhouette là chọn k phù hợp cho KMeans. 

Quy trình gồm ba bước:

  1. Fit KMeans cho một dải giá trị k khác nhau
  2. Tính điểm silhouette cho mỗi lần fit
  3. Chọn k có điểm cao nhất

Đây là mã cho quy trình đó:

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)

# Fit KMeans for k=2 to k=10 and keep track of the silhouette score for each
k_values = range(2, 11)
scores = []
for k in k_values:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    labels = kmeans.fit_predict(X)
    scores.append(silhouette_score(X, labels))
    print(f"k={k}: silhouette = {scores[-1]:.3f}")

Đây là điểm số bạn sẽ thấy cho mỗi giá trị k:

Silhouette score across different values of k

Điểm silhouette theo các giá trị k khác nhau

Điểm cao nhất ở k=4. Đó là giá trị bạn nên chọn.

Một điều cần nhớ là điểm silhouette không thay thế kiến thức miền. Nếu bài toán kinh doanh của bạn cần 5 phân khúc khách hàng và điểm silhouette cao nhất ở 4, đừng tự động chọn 4. Thước đo cho bạn thấy nơi dữ liệu có cấu trúc sạch nhất, nhưng đôi khi số cụm đúng là số tương ứng với điều có ý nghĩa trong bài toán của bạn.

Điểm Silhouette so với các thước đo phân cụm khác

Điểm silhouette có lẽ là thước đo phổ biến nhất để đánh giá phân cụm, nhưng không phải là duy nhất. Dưới đây là so sánh với các lựa chọn thay thế.

Điểm silhouette vs. phương pháp khuỷu tay

Phương pháp khuỷu tay là kỹ thuật trực quan để chọn k trong KMeans. Bạn fit các mô hình cho một dải giá trị k, vẽ đồ thị quán tính (tổng bình phương trong cụm) theo k, và chọn giá trị nơi đường cong gập khúc rõ rệt.

Phương pháp khuỷu tay có lợi thế vì chạy nhanh và dễ thực hiện. Nhưng "khuỷu tay" không phải lúc nào cũng rõ. Với dữ liệu nhiễu, đường cong có thể trông mượt và bạn không thể xác định chỗ gập.

Điểm silhouette cho bạn một con số thực cho mỗi giá trị k, nên bạn có thể so sánh ý nghĩa hơn. Tính toán chậm hơn, nhưng không để quyết định phụ thuộc vào cảm nhận trực quan.

Dùng phương pháp khuỷu tay để kiểm tra nhanh. Dùng điểm silhouette khi bạn cần một câu trả lời có cơ sở.

Điểm silhouette vs. chỉ số Davies-Bouldin

Chỉ số Davies-Bouldin (DBI) đo mức tương đồng trung bình giữa mỗi cụm và cụm giống nó nhất. DBI càng thấp nghĩa là phân cụm càng tốt, và điểm hoàn hảo là 0.

DBI dùng tâm cụm để tính tương đồng, giúp tính nhanh hơn điểm silhouette trên các bộ dữ liệu lớn. Nó cũng dựa trên trực giác tương tự về việc thưởng cho cụm chặt và tách biệt tốt.

Điểm hạn chế là DBI chỉ cho bạn biết về phân cụm nói chung. Điểm silhouette còn cho điểm theo từng điểm, nhờ đó bạn có thể tìm điểm ranh giới và ngoại lệ.

Dùng DBI nếu bạn làm việc với bộ dữ liệu lớn và tốc độ quan trọng. Dùng điểm silhouette khi bạn muốn xem xét từng điểm riêng lẻ.

Điểm silhouette vs. chỉ số Calinski-Harabasz

Chỉ số Calinski-Harabasz (CH), còn gọi là tiêu chí tỷ lệ phương sai, là tỷ lệ giữa độ phân tán giữa các cụm và độ phân tán trong cụm. Điểm cao hơn nghĩa là phân cụm tốt hơn, và điểm này không bị chặn trên (không có giới hạn trên).

CH nhanh và hoạt động tốt trên dữ liệu lớn vì chỉ liên quan đến thống kê ở mức cụm. Giống như silhouette và DBI, nó hoạt động tốt nhất trên các cụm lồi, tách biệt tốt.

CH cũng không có thang đo tự nhiên, nên bạn chỉ có thể so sánh điểm CH giữa các mô hình trên cùng một bộ dữ liệu, không so giữa các bộ dữ liệu khác nhau.

Dùng CH khi bộ dữ liệu lớn và bạn cần kết quả nhanh. Dùng điểm silhouette khi bạn muốn khả năng diễn giải và hiểu biết ở mức từng điểm dữ liệu.

Thước đo phân cụm nội bộ vs. bên ngoài

Các thước đo ở trên (silhouette, DBI, CH, khuỷu tay) đều là thước đo nội bộ. Chúng đánh giá phân cụm chỉ dựa trên dữ liệu, không cần nhãn chuẩn. Điều này khiến chúng là lựa chọn tiêu chuẩn cho các bài toán phân cụm thực tế, nơi không có nhãn.

Các thước đo bên ngoài so sánh gán cụm với nhãn đã biết. Chỉ số Rand hiệu chỉnh (ARI), Thông tin tương hỗ chuẩn hóa (NMI), và tính đồng nhất là các ví dụ phổ biến. Chúng được dùng khi bạn có nhãn và muốn kiểm tra thuật toán phân cụm mô phỏng nhãn tốt đến đâu.

Dùng thước đo nội bộ khi bạn không có nhãn, đây là trường hợp điển hình. Dùng thước đo bên ngoài khi bạn đang đánh giá chuẩn các thuật toán phân cụm trên dữ liệu có nhãn.

Dưới đây là tóm tắt các thước đo đặt cạnh nhau:

Phương pháp Phạm vi Giá trị tốt nhất Tốc độ Dùng cho
Điểm silhouette -1 đến 1 Gần 1 Chậm trên bộ dữ liệu lớn Dễ diễn giải và hiểu biết theo từng điểm
Phương pháp khuỷu tay 0 đến vô cùng Tìm điểm gập (khuỷu tay) Nhanh Kiểm tra nhanh
Chỉ số Davies-Bouldin 0 đến vô cùng Gần 0 Nhanh Bộ dữ liệu lớn
Chỉ số Calinski-Harabasz 0 đến vô cùng Càng cao càng tốt Nhanh Bộ dữ liệu lớn, không có nhãn

So sánh điểm silhouette với các phương án thay thế

Hạn chế của điểm Silhouette

Điểm silhouette có một vài hạn chế đáng lưu ý:

  • Giả định phân cụm dựa trên khoảng cách: Mặc định điểm silhouette dựa trên khoảng cách Euclid. Nó hoạt động tốt với KMeans và các thuật toán dựa trên tâm cụm khác, nhưng không phù hợp với các phương pháp dựa trên mật độ như DBSCAN, nơi các cụm có hình dạng tùy ý và không có tâm rõ ràng
  • Hoạt động tốt nhất với các cụm nhỏ, tách biệt tốt: Thước đo này ưu ái các cụm chặt, hình cầu ở xa nhau. Nếu dữ liệu của bạn có các cụm gần nhau hoặc chồng lấn, điểm sẽ thấp ngay cả khi phân cụm là đúng
  • Không phù hợp nhất với hình dạng cụm bất quy tắc: Các cụm trong thực tế không phải lúc nào cũng lồi. Nếu dữ liệu của bạn không như vậy, các cụm sẽ có điểm silhouette thấp ngay cả khi việc gán là đúng
  • Chi phí tính toán trên bộ dữ liệu lớn: Tính điểm silhouette cần các khoảng cách cặp điểm, có độ phức tạp O(n^2). Với bộ dữ liệu hàng triệu điểm, điều này trở nên tốn kém
  • Nhạy cảm với thước đo khoảng cách được chọn: Điểm số thay đổi tùy theo bạn dùng khoảng cách Euclid, Manhattan, cosine hay loại khác. Nếu dữ liệu của bạn không tuân theo giả định Euclid, điểm silhouette có thể gây hiểu lầm

Thực hành tốt khi dùng điểm Silhouette

Điểm silhouette hoạt động tốt nhất khi bạn tuân theo một vài thực hành cơ bản:

  • So sánh nhiều lời giải phân cụm: Đừng chỉ tính một điểm silhouette. Bạn nên fit các mô hình phân cụm với các giá trị k khác nhau (hoặc thuật toán khác) và so sánh điểm của chúng cạnh nhau
  • Trực quan hóa các cụm song song với điểm số: Một con số đơn lẻ không kể hết câu chuyện. Hãy vẽ các cụm và xem hình dạng có hợp lý không
  • Đừng tối ưu chỉ để đạt điểm cao nhất: Phân cụm với k=2 thường có điểm cao hơn k=5 ngay cả khi 5 cụm có ý nghĩa trong bài toán của bạn
  • Kết hợp với kiến thức miền: Điểm số cho bạn thấy nơi dữ liệu có cấu trúc sạch. Kiến thức miền cho bạn biết cấu trúc nào thực sự hữu ích. Hãy dùng cả hai
  • Đánh giá nhiều thước đo phân cụm: Silhouette, DBI, CH và các thước đo khác đánh giá chất lượng phân cụm theo cách khác nhau. Khi chúng đồng thuận, bạn đang đi đúng hướng; khi không, hãy xem xét dữ liệu

Kết luận

Điểm silhouette là một trong những cách trực quan nhất để đánh giá phân cụm vì nó thể hiện cả mức độ các điểm gom chặt và mức độ tách biệt giữa các cụm. 

Bạn tính theo từng điểm, lấy trung bình kết quả và nhận một con số từ -1 đến 1. Điểm gần 1 nghĩa là các cụm được xác định rõ hơn, và điểm gần hoặc dưới 0 nghĩa là cấu trúc không thực sự là cấu trúc

Nhưng điểm silhouette chỉ là điểm khởi đầu. Bạn nên kết hợp với trực quan hóa cụm, và quan trọng nhất là kiến thức miền về bài toán. Chỉ khi tất cả những yếu tố này cùng chỉ về một hướng, bạn mới có thể tin tưởng kết quả.

Điểm silhouette là một phần trong bức tranh lớn hơn của Học không giám sát trong Python. Hãy đăng ký hôm nay để học cách phân cụm, biến đổi, trực quan hóa và khai thác insight từ dữ liệu không gán nhãn.


Dario Radečić's photo
Author
Dario Radečić
LinkedIn
Chuyên gia Khoa học Dữ liệu Cấp cao, làm việc tại Croatia. Tác giả Công nghệ Hàng đầu với hơn 700 bài viết đã xuất bản, đạt trên 10 triệu lượt xem. Tác giả cuốn sách Tự động hóa Machine Learning với TPOT.
Chủ đề

Học cùng DataCamp

Courses

Phân cụm bằng R

4 giờ
44.1K
Phát triển trực giác vững chắc về cách hoạt động của phân cụm phân cấp và k-means, đồng thời học cách áp dụng chúng để rút ra insight từ dữ liệu của bạn.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow