機器學習(聚類五)——聚類算法的衡量指標

算法的好壞,都要有相應的指標來衡量。尤其聚類的特殊性,也有一些特殊的算法。

衡量指標

這裏介紹7種能夠用於不同場景下聚類算法的衡量指標:

  1. 混淆矩陣
  2. 均一性
  3. 整性
  4. V-measure
  5. 調整蘭德係數(ARI)
  6. 調整互信息(AMI)
  7. 輪廓係數(Silhouette)

前三個就是混淆矩陣那些。前五個衡量時引入了y,用的比較少,做個瞭解就可。爲什麼呢?都有y值了,我完全可以直接用分類,幹嗎用聚類。輪廓係數用的比較多。

1)混淆矩陣
這裏就不提了,前面的文章《機器學習(概述二)——開發流程》 已經做過詳細的介紹。

2)均一性(類似正確率)
一個簇中只包含一個類別的樣本,則滿足均一性;其實也可以認爲就是正確率(每個聚簇中正確分類的樣本數佔該聚簇總樣本數的比例和)
p=1ki=1kN(Ci==Ki)N(Ki)p=\frac{1}{k} \sum_{i=1}^k \frac{N(C_i ==K_i)}{N(K_i)}

3)完整性(類似召回率)
同類別樣本被歸類到相同簇中,則滿足完整性;每個聚簇中正確分類的樣本數佔該類型的總樣本數比例的和。
r=1ki=1kN(Ci==Ki)N(Ci)r=\frac{1}{k} \sum_{i=1}^k \frac{N(C_i ==K_i)}{N(C_i)}

4)V-measure
均一性和完整性的加權平均
Vβ=(1+β2)prβ2p+rV_\beta = \frac{(1+\beta^2) \cdot pr}{\beta^2 \cdot p + r}

5)調整蘭德係數(ARI)
Rand index(蘭德指數)(RI),RI取值範圍爲[0,1],值越大意味着聚類結果與真實情況越吻合。
RI=a+bC2nsamplesRI=\frac{a+b}{C_2^{n_{samples}}}
其中C表示實際類別信息,K表示聚類結果,a表示在C與K中都是同類別的元素對數(也就是行),b表示在C與K中都是不同類別的元素對數(也就是列),C2nsamplesC_2^{n_{samples}}表示數據集中可以組成的對數,即從樣本中取兩個.
在這裏插入圖片描述
調整蘭德係數(ARI,Adjusted Rnd Index),ARI取值範圍[-1,1],值越大,表示聚類結果和真實情況越吻合。從廣義的角度來將,ARI是衡量兩個數據分佈的吻合程度的。
ARI=(RIE[RI])max[RI]E[RI]E[RI]ARI=\frac{(RI−E[RI])}{\max⁡ [RI]−E[RI]}\quad\quad E[RI]表示均值

6)調整互信息(AMI)
調整互信息(AMI,Adjusted Mutual Information),類似ARI,內部使用信息熵
S={s1,s2,...,sN}U={U1,U2,...,UR}V=V1,V2,...,VC S=\{s_1,s_2,...,s_N\} \quad U=\{U_1,U_2,...,U_R\} \quad V={V_1,V_2,...,V_C} UiUj=ViVj=i=1RUi=j=1CVj=Snij=UiVj U_i \cap U_j = V_i \cap V_j = \emptyset \quad \cup _{i=1}^R U_i = \cup_{j=1}^C V_j = S \quad n_{ij} =|U_i \cap V_j| P(i)=UiNP(j)=ViNH(U)=i=1RP(i)logP(i)H(V)=j=1CP(j)logP(j) P(i)=\frac{|U_i|}{N} \quad P(j)=\frac{|V_i|}{N} \quad H(U) = -\sum_{i=1}^R P(i) \log P(i) \quad H(V) = -\sum_{j=1}^C P^{'}(j) \log P^{'}(j) MI(U,V)=i=1Rj=1CP(i,j)logP(i,j)P(i)P(j)P(i,j)=UiVjN MI(U,V)=\sum_{i=1}^R \sum_{j=1}^C P(i,j) \log \frac{P(i,j)}{P(i)P^{'}(j)} \quad P(i,j)=\frac{|U_i \cap V_j|}{N} AMI(U,V)=MI(U,V)E{MI(U,V)}max{H(U),H(V)}E{MI(U,V)} AMI(U,V)=\frac{MI(U,V)-E\{MI(U,V)\}}{\max \{ H(U),H(V)\} -E\{MI(U,V)\}}
SS 表示整個數據集,UU 表示整個預測的數據集,VV 實際數據集(y值),CC 表示原始的,RR 表示預測的。
一個樣本只屬於一個簇,所以 UiUj=U_i∩U_j=∅;一個樣本只能預測出一種結果,所以 ViVj=V_i∩V_j=∅
nij=UiVjn_{ij}=|U_i∩V_j |,表示實際和預測是相同的個數.

7)輪廓係數(Silhouette)
簇內不相似度:計算樣本 ii 到同簇其它樣本的平均距離爲 aia_i ; $a_i $ 越小,表示樣本 ii 越應該被聚類到該簇,簇 CC中的所有樣本的 aia_i 的均值被稱爲簇 CC 的簇不相似度。
簇間不相似度:計算樣本 ii 到其它簇 CjC_j 的所有樣本的平均距離 bijb_{ij}bi=min{bi1,bi2,...,bik}b_i =\min \{b_{i1} ,b_{i2} ,...,b_{ik}\}bib_i 越大,表示樣本 ii 越不屬於其它簇。
輪廓係數sis_i 值越接近 1 表示樣本 ii 聚類越合理,越接近 -1,表示樣本i應該分類到另外的簇中,近似爲 0,表示樣本i應該在邊界上;所有樣本的 sis_i 的均值被成爲聚類結果的輪廓係數.
s(i)=b(i)a(i)max{a(i),b(i)}s(i)=\frac{b(i)−a(i)}{\max \{a(i),b(i)\}}
s(i)={1a(i)b(i),a(i)<b(i)0,a(i)=b(i)b(i)a(i)1,a(i)>b(i) s(i)=\begin{cases} 1-\frac{a(i)}{b(i)}, a(i)<b(i)\\ 0, a(i)=b(i)\\ \frac{b(i)}{a(i)}-1, a(i)>b(i)\\ \end{cases}

我們希望的是最終結果越趨近於1越好

代碼

基於scikit包中的創建模擬數據的API創建聚類數據,對K-Means算法和Mini Batch K-Means算法構建的模型進行評估。

API

調整蘭德係數(ARI):sklearn.metrics.adjusted_rand_score(labels_true, labels_pred)

  • labels_true表示實際的
  • labels_pred表示預測的

V-measure:sklearn.metrics.v_measure_score(labels_true, labels_pred, beta=1.0)

調整互信息(AMI):sklearn.metrics.adjusted_mutual_info_score(labels_true, labels_pred, average_method=‘arithmetic’)

互信息(MI):sklearn.metrics.mutual_info_score(labels_true, labels_pred, contingency=None)

代碼
我們採用上篇博客相同的內容。

import time
import numpy as np  
import matplotlib.pyplot as plt  
import matplotlib as mpl
from sklearn.cluster import MiniBatchKMeans, KMeans 
from sklearn import metrics
from sklearn.metrics.pairwise import pairwise_distances_argmin  
from sklearn.datasets.samples_generator import make_blobs  

## 設置屬性防止中文亂碼
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

centers = [[1, 1], [-1, -1], [1, -1]] 
clusters = len(centers)       

X, Y = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7, random_state=28) 
Y # 在實際工作中是人工給定的,專門用於判斷聚類的效果的一個值
### TODO: 實際工作中,我們假定聚類算法的模型都是比較可以,最多用輪廓係數/模型的score api返回值進行度量;
### 其它的效果度量方式一般不用
### 原因:其它度量方式需要給定數據的實際的y值 ===> 當我給定y值的時候,其實我可以直接使用分類算法了,不需要使用聚類

array([2, 0, 0, …, 2, 2, 1])

k_means = KMeans(init='k-means++', n_clusters=clusters, random_state=28)
t0 = time.time() 
k_means.fit(X)  
km_batch = time.time() - t0  
print ("K-Means算法模型訓練消耗時間:%.4fs" % km_batch)

K-Means算法模型訓練消耗時間:0.0981s

batch_size = 100
mbk = MiniBatchKMeans(init='k-means++', n_clusters=clusters, batch_size=batch_size, random_state=28)  
t0 = time.time()  
mbk.fit(X)  
mbk_batch = time.time() - t0  
print ("Mini Batch K-Means算法模型訓練消耗時間:%.4fs" % mbk_batch)

Mini Batch K-Means算法模型訓練消耗時間:0.0460s

km_y_hat = k_means.labels_
mbkm_y_hat = mbk.labels_
print(km_y_hat) # 樣本所屬的類別

[0 2 2 … 1 1 0]

k_means_cluster_centers = k_means.cluster_centers_
mbk_means_cluster_centers = mbk.cluster_centers_
print ("K-Means算法聚類中心點:\ncenter=", k_means_cluster_centers)
print ("Mini Batch K-Means算法聚類中心點:\ncenter=", mbk_means_cluster_centers)
order = pairwise_distances_argmin(k_means_cluster_centers,  
                                  mbk_means_cluster_centers) 
order

K-Means算法聚類中心點:
center= [[-1.0600799 -1.05662982]
[ 1.02975208 -1.07435837]
[ 1.01491055 1.02216649]]
Mini Batch K-Means算法聚類中心點:
center= [[ 0.99602094 1.10688195]
[-1.00828286 -1.05983915]
[ 1.07892315 -0.94286826]]

array([1, 2, 0], dtype=int64)

### 效果評估
score_funcs = [
    metrics.adjusted_rand_score,#ARI
    metrics.v_measure_score,#均一性和完整性的加權平均
    metrics.adjusted_mutual_info_score,#AMI
    metrics.mutual_info_score,#互信息
]

## 2. 迭代對每個評估函數進行評估操作
for score_func in score_funcs:
    t0 = time.time()
    km_scores = score_func(Y,km_y_hat)
    print("K-Means算法:%s評估函數計算結果值:%.5f;計算消耗時間:%0.3fs" % (score_func.__name__,km_scores, time.time() - t0))
    
    t0 = time.time()
    mbkm_scores = score_func(Y,mbkm_y_hat)
    print("Mini Batch K-Means算法:%s評估函數計算結果值:%.5f;計算消耗時間:%0.3fs\n" % (score_func.__name__,mbkm_scores, time.time() - t0))

K-Means算法:adjusted_rand_score評估函數計算結果值:0.72526;計算消耗時間:0.199s
Mini Batch K-Means算法:adjusted_rand_score評估函數計算結果值:0.72421;計算消耗時間:0.002s

K-Means算法:v_measure_score評估函數計算結果值:0.65754;計算消耗時間:0.011s
Mini Batch K-Means算法:v_measure_score評估函數計算結果值:0.65780;計算消耗時間:0.003s

K-Means算法:adjusted_mutual_info_score評估函數計算結果值:0.65726;計算消耗時間:0.026s
Mini Batch K-Means算法:adjusted_mutual_info_score評估函數計算結果值:0.65757;計算消耗時間:0.006s

K-Means算法:mutual_info_score評估函數計算結果值:0.72231;計算消耗時間:0.003s
Mini Batch K-Means算法:mutual_info_score評估函數計算結果值:0.72264;計算消耗時間:0.002s

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章