你的聚類模型靠譜嗎?5大外部指標徹底揭秘
在聚類分析中,我們常常需要評估聚類結果的質量。
外部指標是一種通過與已知的“真實標簽”進行比較來評估聚類性能的方法。
這些指標可以幫助我們判斷聚類算法是否能夠準確地將數據劃分為有意義的類別。
本文將介紹幾種常見的外部指標,包括 Jaccard 系數、FM 指數、Rand 指數、DB 指數和 Dunn 指數,并通過代碼示例展示如何基于scikit-learn庫來計算它們。
1. Jaccard系數
Jaccard 系數是一種衡量兩個集合相似度的指標,在聚類評估中,它用于比較聚類結果與真實標簽之間的相似性。
具體來說,Jaccard 系數定義為兩個集合的交集大小與并集大小的比值。
對于聚類結果,它關注的是每個類別內部的樣本是否正確劃分。
假設我們有兩個集合$ A \(和\) B \(,**Jaccard 系數**\) J $可以表示為:
$ J(A,B)=\frac{|A\cap B|}{|A\cup B|} $
在聚類評估中,我們通常計算所有類別對的** Jaccard 系數的平均值**,以得到整體的相似度。
Jaccard 系數在scikit-learn庫中已經封裝好,使用方式如下:
from sklearn.metrics import jaccard_score
import numpy as np
# 真實標簽和聚類結果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])
# 計算 Jaccard 系數
jaccard = jaccard_score(true_labels, predicted_labels, average="macro")
print("Jaccard 系數:", jaccard)
可以調節上面的true_labels和predicted_labels,試試不同的計算結果。
2. FM(Fowlkes-Mallows)指數
FM 指數是一種綜合考慮了真正例(TP)、假正例(FP)和假負例(FN)的指標。
它通過計算精確率(Precision)和召回率(Recall)的幾何平均值來衡量聚類結果的質量。
具體公式如下:
$ \text{FM}=\sqrt{\frac{TP}{TP+FP}\times\frac{TP}{TP+FN}} $
其中:
- $ TP $是正確分類的樣本對數。
- $ FP $是錯誤分類為同一類的樣本對數。
- $ FN $是應該在同一類但被分類到不同類的樣本對數。
FM 系數在scikit-learn庫中已經封裝好,使用方式如下:
from sklearn.metrics import fowlkes_mallows_score
# 真實標簽和聚類結果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])
# 計算 FM 指數
fm = fowlkes_mallows_score(true_labels, predicted_labels)
print("FM 指數:", fm)
3. Rand指數
Rand 指數是一種衡量聚類結果與真實標簽一致性的指標,它通過計算樣本對的分類一致性來評估聚類質量。
具體來說,Rand 指數定義為:
$ \text{Rand}=\frac{TP+TN}{TP+TN+FP+FN} $
其中:
- $ TP $是正確分類為同一類的樣本對數。
- $ TN $是正確分類為不同類的樣本對數。
- $ FP $是錯誤分類為同一類的樣本對數。
- $ FN $是應該在同一類但被分類到不同類的樣本對數。
Rand 指數在scikit-learn庫中已經封裝好,使用方式如下:
from sklearn.metrics import rand_score
# 真實標簽和聚類結果
true_labels = np.array([0, 0, 1, 1, 2, 2])
predicted_labels = np.array([0, 0, 1, 1, 2, 2])
# 計算 Rand 指數
rand = rand_score(true_labels, predicted_labels)
print("Rand 指數:", rand)
4. DB(Davies-Bouldin)指數
DB 指數是一種衡量聚類結果內部一致性的指標,但它也可以用于外部評估。
DB 指數通過比較每個類別的緊致性和分離性來評估聚類質量。
具體來說,DB 指數定義為:
$ \text{DB}=\frac{1}{k}\sum_{i=1}^{k}\max_{j\neq i}\left(\frac{\sigma_i+\sigma_j}{d(c_i,c_j)}\right) $
其中:
- $ k $是類別數量。
- $ \sigma_i \(是類別\) i $的平均距離。
- $ c_i \(是類別\) i $的中心。
- $ d(c_i,c_j) \(是類別\) i \(和類別\) j $中心之間的距離。
DB 指數越小,表示聚類結果越好。
DB 指數在scikit-learn庫中已經封裝好,使用方式如下:
from sklearn.metrics import davies_bouldin_score
from sklearn.cluster import KMeans
import numpy as np
# 生成數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# 使用 KMeans 進行聚類
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
predicted_labels = kmeans.labels_
# 計算 DB 指數
db = davies_bouldin_score(X, predicted_labels)
print("DB 指數:", db)
5. Dunn指數
Dunn 指數是一種衡量聚類結果分離性和緊致性的指標。
它通過計算類內距離的最小值與類間距離的最大值的比值來評估聚類質量。
具體來說,Dunn 指數定義為:
$ \text{Dunn}=\frac{\min_{i\neq j}d(c_i,c_j)}{\max_i\delta(c_i)} $
其中:
- $ d(c_i,c_j) \(是類別\) i \(和類別\) j $中心之間的距離。
- $ \delta(c_i) \(是類別\) i $內部的最大距離。
Dunn 指數越大,表示聚類結果越好。
Dunn 指數在scikit-learn庫中沒有現成的函數,不過,根據它的公式封裝一個也很簡單:
from sklearn.cluster import KMeans
import numpy as np
# 生成數據
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
# 使用 KMeans 進行聚類
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
predicted_labels = kmeans.labels_
# 計算 Dunn 指數
def dunn_index(X, labels):
n_clusters = len(set(labels))
inter_cluster_distances = []
intra_cluster_distances = []
for i in range(n_clusters):
cluster_points = X[labels == i]
intra_cluster_distances.append(
np.max(
np.linalg.norm(cluster_points - np.mean(cluster_points, axis=0), axis=1)
)
)
for j in range(i + 1, n_clusters):
other_cluster_points = X[labels == j]
inter_cluster_distances.append(
np.min(
np.linalg.norm(
cluster_points[:, np.newaxis] - other_cluster_points, axis=2
)
)
)
return np.min(inter_cluster_distances) / np.max(intra_cluster_distances)
# 計算 Dunn 指數
dunn = dunn_index(X, predicted_labels)
print("Dunn 指數:", dunn)
6. 總結
本文介紹了幾種常見的聚類性能外部評估指標,包括 Jaccard 系數、FM 指數、Rand 指數、DB 指數和 Dunn 指數。
這些指標各有優缺點,適用于不同的場景,使用時,建議:
- 有真實標簽時:優先使用
Adjusted Rand(平衡隨機性) - 無真實標簽時:使用
DB或Dunn - 小規模數據:可計算所有指標綜合判斷
通過靈活組合這些指標,可以全面評估聚類模型的表現!

浙公網安備 33010602011771號