如何評價聚類算法的性能呢?特別是應用在沒有類別標注的數據集上。針對不同的數據特點,有以下兩種方式:
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個樣本xi ,計算樣本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()