聚类 | 超详细的性能度量和相似度方法总结
非監督學習與監督學習最重要的區別在于訓練數據是否包含標記數據,在機器學習開發的工作中,往往包含了大量的無標記數據和少量的標記數據,非監督方法通過對無標記訓練樣本的學習來發掘數據的內在規律,為進一步的數據分析提供基礎。
聚類算法是非監督學習最常用的一種方法,性能度量是衡量學習模型優劣的指標,也可作為優化學習模型的目標函數。聚類性能度量根據訓練數據是否包含標記數據分為兩類,一類是將聚類結果與標記數據進行比較,稱為“外部指標”;另一類是直接分析聚類結果,稱為內部指標。本文對這兩類的性能度量以及相似度方法作一個詳細總結。
目錄
1. 外部指標
2. 內部指標
3. 相似度方法總結
4. 小結
1. 外部指標
在詳細介紹外部指標前,先定義兩兩配對變量a和b:
a:數據集的樣本對既屬于相同簇C也屬于相同簇K的個數
b:數據集的樣本對不屬于相同簇C也不屬于相同簇K的個數
用一個簡單例子來說明a,b的含義:
真實簇向量:[ 0, 0, 0, 1, 1, 1 ]
預測簇向量:[ 0, 0, 1, 1, 2, 2 ]
a為屬于相同簇向量的樣本對個數,用紅色框標記:
如上圖:a = 2;
b為數據集不屬于相同簇C也不屬于相同簇K的樣本對個數,用綠色框標記:
如上圖:b = 1;
知道了a,b的含義,下面開始詳細介紹外部指標的性能度量。
1.1 RI(蘭德系數)
RI是衡量兩個簇類的相似度,假設樣本個數是n,定義:
其中是所有可能的樣本對個數。
假設:
真實簇向量:[ 0, 0, 0, 1, 1, 1 ]
預測簇向量:[ 0, 0, 1, 1, 2, 2 ]
RI系數的缺點是隨著聚類數的增加,隨機分配簇類向量的RI也逐漸增加,這是不符合理論的,隨機分配簇類標記向量的RI應為0。
1.2 ARI(調整蘭德系數)
ARI解決了RI不能很好的描述隨機分配簇類標記向量的相似度問題,ARI的定義:
其中E表示期望,max表示取最大值。
上式實現的具體公式:
其中 i,j分別為真實簇類和預測簇類,表示真實簇類為i,預測簇類為j的個數,的含義與下表的相同,的含義與下表的相同。
用上面的例子來解釋ARI的計算過程。
假設:
真實簇向量:[ 0, 0, 0, 1, 1, 1 ]
預測簇向量:[ 0, 0, 1, 1, 2, 2 ]
表格統計簇向量配對的個數:
因此,根據表格計算ARI指標:
由表格可知:
所以:ARI = 0.2424
from sklearn import metrics # 真實的簇 labels_true = [0, 0, 0, 1, 1, 1] # 預測的簇 labels_pred = [0, 0, 1, 1, 2, 2] # 計算ARI ARI = metrics.adjusted_rand_score(labels_true, labels_pred) ARI#> 0.24242424242424246優點:
1)ARI的取值范圍為[-1,1],ARI越大表示預測簇向量和真實簇向量相似度越高,,ARI接近于0表示簇向量是隨機分配,ARI為負數表示非常差的預測簇向量;
2)對于任意的簇類數和樣本數,隨機分配標簽的ARI分數接近于0;
3)可用于評估無假設簇類結構的性能度量,如比較通過譜聚類降維后的k均值聚類算法的性能;
缺點:
1)需要知道真實數據的標記類信息,因此在實踐中很難得到應用或可以人工手動標定數據(類似監督學習);
1.3 AMI(調整的互信息指數)
AMI是基于預測簇向量與真實簇向量的互信息分數來衡量其相似度的,AMI越大相似度越高,AMI接近于0表示簇向量是隨機分配的。MI(互信息指數)和NMI(標準化的互信息指數)不符合簇向量隨機分配的理論,即隨著分配簇的個數增加,MI和NMI亦會趨向于增加,AMI的值一直接近于0,因此采用AMI作為基于互信息的角度衡量簇向量間的相似度。由于篇幅原因,這里不再介紹具體的AMI計算公式,讀者可參考scikit-learn官方網址的聚類章節。
AMI與MI的對比:
# AMI指數 AMI1 = metrics.adjusted_mutual_info_score(labels_true, labels_pred) print('AMI= ',AMI) # 若預測簇向量和真實簇向量完全相同 labes_pred = labels_true[:] # 基于調整互信息指數分析的相似度應該為1 AMI2 = metrics.adjusted_mutual_info_score(labels_true, labes_pred) print('AMI2= ',AMI2) # 基于標準化互信息指數的相似度亦為1 NMI1 = metrics.normalized_mutual_info_score(labels_true, labes_pred) print('NMI1= ',NMI1) # 基于互信息指數的相似度不為1,不符合理論 MI = metrics.mutual_info_score(labels_true, labes_pred) print('MI= ',MI)#> AMI1= 0.2250422831983088 AMI2= 1.0 NMI1= 1.0 MI= 0.6931471805599452若簇向量是隨機分配的,當簇類個數和樣本數都較大時,MI和NMI的值不為0,ARI和AMI的值為0.
# 簇類個數 cluster_num = 100 # 樣本個數 samples = 1000 # 分配函數 seed = 45 random_labels = np.random.RandomState(seed).randint # 隨機分配真實簇向量 labels_true = random_labels(low=0,high=cluster_num,size=samples) # 隨機分配預測簇向量 labels_pred = random_labels(low=0,high=cluster_num,size=samples) # AMI計算相似度 AMI = metrics.adjusted_mutual_info_score(labels_true, labels_pred) print('AMI= ',AMI) # NMI計算相似度 NMI = metrics.normalized_mutual_info_score(labels_true, labels_pred) print('NMI= ',NMI) # MI計算相似度 MI = metrics.mutual_info_score(labels_true, labels_pred) print('MI= ',MI) # ARI計算相似度 ARI = metrics.adjusted_mutual_info_score(labels_true, labels_pred) print('ARI= ',ARI) #> AMI= 0.006054902942529268 # 接近0 NMI= 0.5004078317894934 MI= 2.2775606710406766 ARI= 0.006054902942529268 # 接近0優點:
1)對于任意的簇類數和樣本數,隨機分配標簽的AMI分數接近于0。
2)有界范圍[0,1]:0附近表示兩個標簽很大程度上是相互獨立的,接近1表示一致的簇向量。
缺點:
1)這類指標需要知道真實數據的標記類信息,因此在實踐中很難得到應用或可以人工手動標定數據(類似監督學習)
2)隨機標簽分配的NMI和MI不為0。
1.4 同質性,完整性和V-measure
同質性和完整性是基于條件熵的互信息分數來衡量簇向量間的相似度,V-meansure是同質性和完整性的調和平均。
同質性(homogeneity):每個簇只包含單個類成員;
完整性(completeness):給定類的所有成員分配給同一簇類;
同質性為1的情況:
# 同質性為1的情況 labels_true = [0, 0, 0, 1, 1, 1] labels_pred = [0, 0, 1, 2, 2, 2] homogeneity=metrics.homogeneity_score(labels_true, labels_pred) print('homogeneity= ',homogeneity)#> homogeneity= 1.0完整性為1的情況:
# 完整性為1的情況 labels_true = [0, 1, 1, 1, 2, 2] labels_pred = [0, 0, 0, 0, 2, 2] completeness=metrics.completeness_score(labels_true, labels_pred) print('completeness= ',completeness)#> completeness= 1.0V-measure是結合同質性和完整性兩個因素來評價簇向量間的相似度,V-measure為1表示最優的相似度:
# V-measure為1的情況 labels_true = [0, 0, 1, 1, 2, 2] labels_pred = [1, 1, 2, 2, 3, 3] completeness=metrics.v_measure_score(labels_true, labels_pred) print('completeness= ',completeness)#> completeness= 1.0若V-measure值較小,我們可以從同質性和完整性方面給出定性的分析:
# V-measure的定性分析 labels_true =[0,0,0,1,1,1] labels_pred =[0,0,0,1,2,3] metrics.homogeneity_completeness_v_measure(labels_true,labels_pred)# 順序為:同質性,完整性和V-measure #> (0.9999999999999997, 0.5578858913022595, 0.7162089270041652)結果分析,V-measure值較小的原因是簇向量間的同質性較差。
優點:
1)有界的分數:0表示相似度最低,1表示相似度最高,分數與相似度成正相關的關系;
2)解釋直觀:對具有較差V-measure的聚類進行同質性和完整性的定性分析,明確聚類算法的錯誤類型;
3)對簇的結構沒有作任何假設:如比較通過譜聚類降維后的k均值聚類算法的性能;
缺點:
1)隨機標記沒有標準化,因此隨機標記不會總是產生相同的同質性、完整性和V-measure分數。特別是當簇類數量較大時,隨機標記的V-meaure值不為0。
當樣本數量大于1000簇類數量小于10時,這類問題可以忽略。對于更小的樣本數量或更大的簇類數量,建議使用調整系數(比如ARI和AMI)。如下圖,隨著簇類個數的增加,隨機標記的ARI和AMI值都接近于0,V-measure和mutual_info_score(互信息分數)逐漸增加;
2)這類指標需要知道真實數據的標記類信息,因此在實踐中很難得到應用或可以人工手動標定數據(類似監督學習)。
1.5 Fowlkes-Mallows分數
Fowlkes-Mallows指數(FMI)是成對準確率和召回率的幾何平均值:
其中TP是真正例(True Positive),即真實標簽和預測標簽屬于相同簇類的樣本對個數;FP是假正例(False Positive),即真實標簽屬于同一簇類,相應的預測標簽不屬于該簇類的樣本對個數;FN是假負例(False Negative),即預測標簽屬于同一簇類,相應的真實標簽不屬于該簇類的樣本對個數。
假設真實簇向量:[ 0, 0, 0, 1, 1, 1 ],預測簇向量:[ 0, 0, 1, 1, 2, 2 ],求簇向量間的FMI.
根據定義可得:
TP = 2,FP=3,FN=1
因此:
代碼表示:
# Fowlker-Mallows scores labels_true =[0,0,0,1,1,1] labels_pred =[0,0,1,1,2,2] metrics.fowlkes_mallows_score(labels_true,labels_pred)#> 0.4714045207910317優點:
1)對于任意的簇類數和樣本數,隨機簇類標簽的FMI近似于0;
2)有界范圍:FMI范圍為[0,1],值接近于0表示隨機分配的標簽在很大程度上是相互獨立的,接近于1表示一致的簇向量;
3)對簇的結構沒有作任何假設:可用來比較通過譜聚類降維后的k均值聚類算法的性能;
缺點:
1)這類指標需要知道真實數據的標記類信息,因此在實踐中很難得到應用或可以人工手動標定數據(類似監督學習)。
2. 內部指標
如果數據集標簽未知,則必須使用模型本身的內部指標去度量聚類性能。
下面對內部指標進行總結:
2.1 輪廓系數(Silhouette Coefficient)
每個樣本有對應的輪廓系數,輪廓系數由兩個得分組成:
-
a:樣本與同一簇類中的其他樣本點的平均距離;
-
b:樣本與距離最近簇類中所有樣本點的平均距離;
每個樣本的輪廓系數定義為:
一組數據集的輪廓系數等于該數據集中每一個樣本輪廓系數的平均值。
from sklearn import metrics from sklearn.cluster import KMeans from sklearn import datasets # 生成數據集 dataset = datasets.load_iris() X = dataset.data y = dataset.target # 構建K均值聚類模型 kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X) labels = kmeans_model.labels_ # 輪廓系數 metrics.silhouette_score(X, labels, metric='euclidean')#> 0.5528190123564091優點:
1)輪廓系數處于[-1,1]的范圍內,-1表示錯誤的聚類,1表示高密度的聚類,0附近表示重疊的聚類;
2)當簇密度較高且分離較大時,聚類的輪廓系數亦越大;
缺點:
1)凸簇的輪廓系數比其他類型的簇高,比如通過DBSCAN獲得的基于密度的簇。
2.2 Caliniski-Harabaz指數
評價聚類模型好的標準:同一簇類的數據集盡可能密集,不同簇類的數據集盡可能遠離。
定義簇類散度矩陣:
簇間散度矩陣:
其中為簇類q的樣本集,為簇類q的中心,為簇類q的樣本數,c為所有數據集的中心。
根據協方差的相關概念,我們用簇類散度矩陣的跡表示同一簇類的密集程度,跡越小,同一簇類的數據集越密集(方差越小);簇間散度矩陣的跡表示不同簇間的遠離程度,跡越大,不同簇間的遠離程度越大(方差越大)。
結合評價聚類模型的標準,定義Calinski-Harabaz指數:
其中N為數據集樣本數,k為簇類個數,,分別為簇間散度矩陣和簇類散度矩陣的跡。
# Caliniski-Harabaz指數 kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X) labels = kmeans_model.labels_ metrics.calinski_harabaz_score(X, labels)#> 561.62775662962優點:
1)當簇類密集且簇間分離較好時,Caliniski-Harabaz分數越高,聚類性能越好。
2)計算速度快。
缺點:
1)凸簇的Caliniski-Harabaz指數比其他類型的簇高,比如通過DBSCAN獲得的基于密度的簇。
2.3 DB指數(Davies-Bouldin Index)
我們用簇類C的平均距離表示該簇類的密集程度:
其中|C|表示簇類C的個數,dist(·,·)計算兩個樣本之間的距離。
不同簇類中心的距離表示不同簇類的遠離程度:
其中,分別為簇類和的中心。
結合聚類模型評價標準,定義DB指數:
DB指數的下限為0,DB指數越小,聚類性能越好。
優點:
1)DB指數的計算比輪廓系數簡單;
2)DB指數的計算只需要知道數據集的數量和特征;
缺點:
1)凸簇的DB指數比其他類型的簇高,比如通過DBSCAN獲得的基于密度的簇。
2)簇類中心的距離度量限制在歐式空間
至此,本節介紹了評價聚類性能特性的內部指標,內部指標是基于相似度展開的,若聚類結果的同一簇類的相似度好,不同簇間的相似度差,我們認為聚類性能較好。內部指標如輪廓系數和DB指數是基于樣本間的距離來計算相似度,Calinski-Harabaz指數是基于協方差來計算相似度。下一節總結樣本間的相似度算法。
3. 相似度算法總結
評價樣本間相似度常用的方法是距離計算、余弦相似度計算和核函數計算,若樣本間的距離越小,則相似度越高;若樣本間的核函數值越大,則相似度越高。
距離和核函數的轉換關系:
其中D是樣本間的距離,gamma常取(1/features),S為映射的核。
?
下面總結了常用的相似度計算方法。
3.1? 距離計算
給定樣本與,計算樣本距離最常用方法的是“閔可夫斯基距離”(Minkowski distance)。
公式:
其中p≥1。
p=2時,閔可夫斯基距離即歐氏距離(Euclidean distance)
# 歐式距離 import numpy as np from sklearn.metrics import pairwise_distances from sklearn.metrics.pairwise import pairwise_kernels X = np.array([[2, 3]]) Y = np.array([[0, 1]]) pairwise_distances(X, Y, metric='euclidean')#> array([[2.82842712]])p=1時,閔可夫斯基距離即曼哈頓距離(Manhattan distance)
#曼哈頓距離 pairwise_distances(X, Y, metric='manhattan')#> array([[4.]])3.2 余弦相似度計算
公式:
# 余弦相似度計算 pairwise_distances(X,Y,metric='cosine')#> array([[0.16794971]])3.3 線性核
# 線性核計算 pairwise_kernels(X,Y,metric='linear')#> array([[3.]])3.4 多項式核函數
# 多項式核計算 coef0 = 1 degress = 3 metrics.pairwise.polynomial_kernel(X, Y, degree=3,gamma=0.2,coef0=1)#> array([[4.096]])3.5 Sigmoid核函數
# Sigmoid核函數 metrics.pairwise.sigmoid_kernel(X, Y,gamma=0.2,coef0=1)#> array([[0.92166855]])3.6 RBF核函數
# RBF核函數 metrics.pairwise.sigmoid_kernel(X, Y,gamma=0.2)#> array([[0.92166855]])3.7 拉普拉斯核函數
# 拉普拉斯核函數 metrics.pairwise.laplacian_kernel(X, Y, gamma=0.2)#> array([[0.44932896]])3.8 卡方核函數
# 卡方核函數 metrics.pairwise.chi2_kernel(X, Y, gamma=0.2)#> array([[0.54881164]])4. 小結
本文總結了聚類的性能度量方法和相似度計算方法,主要參考了scikit-learn官方網站的文檔,正在看這部分內容的童鞋可以參考該文檔去學習。
參考
https://scikit-learn.org/stable/modules/metrics.html#metrics
https://scikit-learn.org/stable/modules/clustering.html#clustering
周志華 《機器學習》
備注:公眾號菜單包含了整理了一本AI小抄,非常適合在通勤路上用學習。
喜歡文章,點個在看
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的聚类 | 超详细的性能度量和相似度方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI基础:优化算法
- 下一篇: 实用 | PyCharm常用快捷键整理