聚类算法性能评估

如何评价聚类算法的性能呢?特别是应用在没有类别标注的数据集上。针对不同的数据特点,有以下两种方式:

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()

 

posted @ 2019-01-08 09:47  cola_cola  阅读(4029)  评论(0编辑  收藏  举报