python環境
聚類性能度量
外部指標
聚類結果與某個參考模型進行比較
首先,先定義計算用到的數據集。對於數據集D={x1,x2,...,xn},假定通過聚類得出的聚類結果爲C={c1,c2,...ck} ,每一類的類別標籤爲λ;參考模型的聚類結果爲C∗={c1∗,c2∗,...,cs∗},類別標籤爲λ∗。
定義四個集合:
a=∣SS∣,SS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
b=∣SD∣,SD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
c=∣DS∣,DS={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
d=∣DD∣,DD={(xi,xj)∣λi=λj,λi∗=λj∗,i<j}
也就是說隨便從數據集中拿出兩個樣本來,那麼這兩個樣本要麼在同一類,要麼不同類,只有這兩種情況。那麼在兩個模型下,就會產生上面的那四種集合。且a+b+c+d=n*(n-1)/2,即無向完全圖邊的數目。
Jaccard係數
JC=a+b+cb+c
上述公式是python3.7中實現的公式,表明兩個集合的不相似度。
import scipy.spatial.distance as dist
a=[1,0,1]
b=[0,1,1]
print(dist.jaccard(a,b))
FM指數
FMI=a+ba⋅a+ca
表示兩個集合的相似度
取值[0,1],越接近1相似度越大
from sklearn.metrics.cluster import fowlkes_mallows_score
fowlkes_mallows_score([2, 2, 1, 1], [1, 1, 2, 2])
fowlkes_mallows_score([2, 2, 2, 1], [1, 1, 2, 2])
內部指標
直接進行聚類評估,不利用任何參考模型
同樣先定義一些函數:
- 類C內樣本間的平均距離:avg(C)=∣C∣(∣C∣−1)2∑1≤i<j≤∣C∣dist(xi,xj)
- 類內最遠距離:diam(C)=max1≤i<j≤∣C∣dist(xi,xj)
- 兩類的最近樣本間距離:dmin(Ci,Cj)=minxi∈Ci,xj∈Cjdist(xi,xj)
- 兩類中心點的距離:dcen(Ci,Cj)=dist(μi,μj)
DB指數
DBI=k1i=1∑kmaxj=i(dcen(μi,μj)avg(Ci)+avg(Cj))
當聚類中心未給出時,DB指數可以評估模型聚類的優劣。DB指數反映了類間相似度,所以DBI越接近0,說明聚類效果越好
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import davies_bouldin_score
iris = datasets.load_iris()
X = iris.data
kmeans = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans.labels_
davies_bouldin_score(X, labels)
Dunn指數
DI=min1≤i≤k{minj=i(max1≤l≤kdiam(Cl)dmin(Ci,Cj))}
python中沒有現成的DI代碼,需要自己造輪子
DI代表了類間的距離關係,值越大越好。
參考資料
[1] : https://scikit-learn.org/stable/modules/classes.html?highlight=ri#module-sklearn.metrics
[2] : 周志華 機器學習 西瓜書