另一种评估聚类质量的定量分析方法是轮廓分析(silhouette analysis),此方法也可用于k-means之外的其他聚类方法。轮廓分析可以使用一个图形工具来度量簇中样本聚集的密集程度。通过如下三个步骤,我们可以计算数据集中单个样本的轮廓系数(silhouette coefficient):
1)将某一样本x(i)与簇内其他点之间的平均距离看作是簇的内聚度a(i)。
2)将样本x(i)与其最近簇中所有点之间的平均距离看作是与下一最近簇的分离度b(i)。
3)将簇分离度与簇内聚度之差除以二者中的较大者得到轮廓系数,如下式所示:
轮廓系数的值介于-1到1之间。从上式可见,若簇内聚度与分离度相等(b(i)=a(i)),则轮廓系数值为0。此外,由于b(i)衡量样本与其他簇内样本间的差异程度,而a(i)表示样本与簇内其他样本的相似程度,因此,如果b(i)>>a(i),我们可以近似得到一个值为1的理想的轮廓系数。
轮廓系数可通过scikit-learn中metric模块下的silhouette_samples计算得到,也可选择使用silhouette_scores。后者计算所有样本点的轮廓系数均值,等价于numpy.mean(silhouette_samples(…))。执行下面的代码,我们可以绘制出k=3时k-means算法的轮廓系数图:
通过观察轮廓图,我们可以快速知晓不同簇的大小,而且能够判断出簇中是否包含异常点。
由上图可见,轮廓系数未接近0点,此指标显示聚类效果不错。此外,为了评判聚类效果的优劣,我们在图中增加了轮廓系数的平均值(虚线)。
为了解聚类效果不佳的轮廓图的形状,我们使用两个中心点来初始化k-means算法:
由下图可见,样本点形成了三个球状分组,其中一个中心点落在了两个球状分组的中间。尽管聚类结果看上去不是特别糟糕,但它并不是最合适的结果。
接下来,我们绘制轮库图对聚类结果进行评估。请记住,在实际应用中,我们常常处理的是高维数据,因此并不奢望使用二维散点图对数据集进行可视化。
由结果图像可见,轮廓具有明显不同的长度和宽度,这更进一步证明该聚类并非最优结果。