判斷聚類成果的好壞並不像監督學習中的分類任務一樣可以直接依據預測的準確度,因為無監督學習中沒有標準的「正確答案」。然而,仍有一些常見的評估指標和方法可以用來衡量聚類的效果。這些方法主要包括內部指標(根據數據本身進行評估)和外部指標(當你有標籤數據可供參考時進行比較)。
內部指標是一種無需依賴標籤數據的聚類結果評估方法,這些指標依據數據本身的特徵和聚類結構來判斷聚類結果的質量。它們主要衡量兩個方面:群集內部的緊密度(凝聚性) 和 群集之間的分離度。理想的聚類結果應該是同一群集內的數據點彼此接近,而不同群集之間的數據點應該相互遠離。
# 可使用目錄功能快速確認要閱覽的主題
方法選擇參考
輪廓係數(Silhouette Score)
輪廓係數(Silhouette Score)是一種綜合考慮了群集內凝聚性和群集間分離性的指標。它的範圍是 [-1, 1],值越大表示聚類效果越好。
運作邏輯
輪廓係數的計算基於兩個主要概念:
- 凝聚性(Cohesion):數據點與其所屬群集中的其他點的相似性,即點與群集中心的距離越小,凝聚性越高。
- 分離性(Separation):數據點與最近其他群集的距離,即點與不同群集的中心點距離越大,分離性越好。
對於每個數據點 i,定義:
- a(i):數據點 i 與其所屬群集內其他點的平均距離,這衡量了點 i 與群集的凝聚性。
- b(i):數據點 i 與最近的另一個群集內所有點的平均距離,這衡量了點 i 與其他群集的分離性。
輪廓係數的計算公式:
- 當 s(i) 越接近 1,表示數據點 i 與所屬群集非常接近,與其他群集分離得很好。
- 當 s(i) 越接近 0,表示數據點位於兩個群集的邊界之間,難以明確分配。
- 當 s(i) 為負數,表示數據點應該更接近另一個群集,聚類結果不理想。
程式碼範例
from sklearn.metrics import silhouette_score
# 計算輪廓係數
silhouette_avg = silhouette_score(X, labels)
print(f"Silhouette Score: {silhouette_avg}")
輪廓係數優點與缺點
優點:
- 綜合考慮了凝聚性和分離性:輪廓係數同時考慮群集內的數據點相似性(凝聚性)以及群集之間的距離(分離性),給出了一個全面的評估指標。
- 適用於不同類型的聚類算法:輪廓係數可以用來評估多種聚類算法,如 K-means、DBSCAN、層次聚類等,適用範圍廣泛。
- 範圍易於解讀:輪廓係數的值範圍為 [-1, 1],值越接近 1 表示效果越好,數據點的聚類結果越清晰,這使得指標易於解讀。
- 無需標籤:輪廓係數是無需標籤的內部指標,適合無監督學習場景。
缺點:
- 計算複雜度較高:對於大數據集,輪廓係數的計算成本較高,因為它需要計算每個數據點與群集內外的距離,時間複雜度為 O(n2)。
- 不適合密度差異大的群集:如果數據中存在密度差異較大的群集,輪廓係數可能會對低密度群集評估不準確,因為低密度群集內的點之間距離可能較大。
群集內距離平方和(Within-Cluster Sum of Squares, WCSS)
群集內距離平方和(WCSS)衡量每個數據點與其所屬群集中心之間的距離平方和。WCSS 是 K-means 聚類中的一個重要指標,用來衡量群集內部的凝聚性。
運作邏輯
WCSS 是所有數據點與其群集中心之間距離的平方和。其目標是最小化這個值,表示群集內部的數據點越緊密地分布在群集中心附近,群集越凝聚。
對於每個群集 Ck:
其中:
- K 是群集數量,
- xi 是群集 Ck 中的數據點,
- μk 是群集中心。
使用方法
- WCSS 越小,表示群集內的凝聚性越強,即數據點彼此之間更接近。K-means 聚類的目標是最小化這個值。
- 肘部法則(Elbow Method) 是基於 WCSS 的一種方法,用於選擇最佳的群集數量。在肘部法則中,當隨著群集數量 K 增加,WCSS 下降的速度明顯減緩時,這個「肘部」位置對應的 K 值通常是最佳的群集數。
程式碼範例(肘部法則)
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 迭代不同的群集數量 K,計算 WCSS
wcss = []
for k in range(1, 11):
kmeans = KMeans(n_clusters=k, random_state=42)
kmeans.fit(X)
wcss.append(kmeans.inertia_) # WCSS 值存儲於 inertia_ 屬性中
# 畫出肘部法則圖
plt.plot(range(1, 11), wcss, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.show()
當 WCSS 隨著群集數的增加而明顯減少,但在某一點之後減少的速度變慢,該點對應的群集數即為最佳選擇。
WCSS 優點與缺點
優點:
- 簡單易懂:WCSS 衡量每個數據點到其群集中心的距離平方和,指標簡單直觀,易於理解。
- 適合 K-means 聚類:WCSS 是 K-means 聚類中最常用的內部評估指標,因為 K-means 的目標就是最小化群集內距離平方和。
- 適合肘部法則來選擇最佳 K 值:WCSS 與肘部法則結合使用,可以幫助選擇 K-means 聚類中的最佳群集數量 K,具有很強的應用價值。
缺點:
- 不考慮群集之間的分離性:WCSS 僅衡量群集內數據點的凝聚性,不考慮不同群集之間的分離度,因此可能無法全面評估聚類質量。
- 需要事先確定 K 值:WCSS 僅適合用於 K-means 聚類,且需要事先確定群集數量 K。如果群集數設定不合理,聚類效果可能不理想。
- 對異常值敏感:由於 WCSS 依賴於數據點與群集中心的距離,因此它對異常值非常敏感,異常值會顯著增大 WCSS 值,從而影響評估結果。
Davies-Bouldin 指數
Davies-Bouldin 指數(DB 指數)是一種衡量群集內擴展度與群集間分離度的比率。DB 指數越小,表示群集之間的分離性較強,群集內部的緊密性較高,聚類效果越好。
運作邏輯
該指數考慮了群集內的擴展度和群集之間的距離。對於每一個群集 Ci,計算其與其他群集 Cj 的相似性比率:
- σ(i) 是群集 i 的擴展度,定義為該群集內所有點到群集中心的平均距離。
- d(i,j) 是群集 i 和群集 j 之間的距離,表示兩個群集的分離度。
Davies-Bouldin 指數是所有群集的平均相似性比率:
其中 K 是群集數量。
使用方法
DB 指數用來評估群集內的緊密性和群集間的分離度,指數越小表示聚類效果越好。
程式碼範例
from sklearn.metrics import davies_bouldin_score
# 計算 Davies-Bouldin 指數
db_score = davies_bouldin_score(X, labels)
print(f"Davies-Bouldin Index: {db_score}")
- DB 指數越小:表示群集內部更緊密,群集之間的分離度更大,聚類效果更好。
- DB 指數可以用來比較不同聚類結果,從而選擇最佳的聚類模型。
Davies-Bouldin 優點與缺點
優點:
- 綜合考慮群集內緊密性和群集間分離性:DB 指數同時考慮了群集內的擴展度(數據點到群集中心的平均距離)和群集之間的距離,能夠較好地平衡凝聚性和分離性。
- 自動適應不同的群集數:Davies-Bouldin 指數不需要事先指定群集數量,可以用來比較不同聚類結果的質量。
- 適用於多種聚類算法:DB 指數可用於多種聚類算法的評估,如 K-means、層次聚類等,具有廣泛適用性。
缺點:
- 敏感於群集間距離的計算:DB 指數對群集間距離的計算方式非常敏感,如果群集間距離計算方式不合適,可能會影響評估結果的準確性。
- 較難解釋:Davies-Bouldin 指數的具體數值範圍並不像輪廓係數那麼直觀,數值越小表示效果越好,但如何判斷具體數值的好壞則不如輪廓係數清晰。
- 無法解釋異常值的影響:當數據集中存在異常值時,DB 指數可能會受到異常值的影響,特別是在計算群集內擴展度時,異常值可能導致群集的擴展度被誇大,從而影響評估結果。