聚類算法性能評估


如何評價聚類算法的性能呢?特別是應用在沒有類別標注的數據集上。針對不同的數據特點,有以下兩種方式:

1、如果被用來評估的數據本身帶有正確的類別信息,可以使用ARI(Adjusted Rand Index)

ARI指標與分類問題中計算准確性的方法類似,同時也兼顧到了類簇無法和分類一一對應的問題

用法:

1 from sklearn import metrics  #導入metrics包
2 print(metrics.adjusted_rand_score(y_test,y_pred))

 

2、如果被用於評估的數據沒有所屬類別,那么我們習慣使用輪廓系數(Silhouette Coefficient)來度量聚類結果的質量。

  • 輪廓系數同時兼顧了聚類的凝聚度Cohesion和分離度Separation,用於評估聚類的效果並且取值范圍為[-1,1]。
  • 輪廓系數越大,表示聚類的效果越好
  • 具體計算步驟如下:
  • (1)對於已聚類數據中第i個樣本x,計算樣本xi與其同一個簇內的所有其他樣本距離的平均值ai,用於量化簇內的凝聚度
  • (2)選取xi外的一個簇b,計算xi與簇b中所有樣本的平均距離,遍歷所有其他簇,找到最近的這個平均距離bi,用於量化簇之間的分離度
  • (3)對於樣本xi,輪廓系數為sci=(bi-ai)/max(bi,ai)
  • (4)最后對所有樣本x求取平均值即為當前聚類結果的整體輪廓系數

用法:

import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt

#分割出3*2=6個子圖 並在子圖1上作圖
plt.subplot(3,2,1)

#初始化原始數據點
x1 = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])
x2 = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])
X=np.array(zip(x1,x2)).reshape(len(x1),2)

#在1號子圖上作出原始數據點陣的分布
plt.xlim([0,10])
plt.ylim([0,10])
plt.title('Instances')
plt.scatter(x1,x2)

colors = ['b','g','r','c','m','y','k','b']
markers = ['o','s','D','v','^','p','*','+']

clusters = [2,3,4,5,8]
subplot_counter = 1
sc_scores = []
for t in clusters:
    subplot_counter += 1
    plt.subplot(3,2,,subplot_counter)
    kmeans_model = KMeans(n_clusters=t).fit(X)

    for i,l in enumerate(kmeans_model.labels_):
        plt.plot(x1[i],x2[i],color=colors[l],marker=markers[l],ls='None')
    plt.xlim([0,10])
    plt.ylim([0,10])

    sc_score = silhouette_score(X,kmeans_model.labels_,metric='euclidean')
    sc_scores.append(sc_score)

#繪制輪廓系數與不同類簇數量的直觀顯示圖
    plt.title('K=%s,silhouette coefficient=%0.03f'%(t,sc_score))

#繪制輪廓系數與不同類簇數量關系曲線
plt.figure()
plt.plot(clusters,sc_scores,'*-')
plt.xlabel('Number of Cluster')
plt.ylabel('Sihouette Coefficient Score')

plt.show()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM