聚类性能的度量
1. 内部指标和外部指标
这是机器学习一书中提出的两种度量方式,书中说的很详细,这里不再赘述,如下图所示:
2.轮廓系数和平方误差
平方误差
平方误差是我们常说的手肘法,我们知道,常用拐点作为聚类数选取的依据,如下图
这时,可取聚类数K=5或6,具体取多少还要根据实际情况来定,因为这只是提供一个参考。(因为有些时候没有明显的拐点,就像一条平滑的曲线)
平方误差在sklearn里面有集成,已经帮我们计算好了,以k-means为例
"""
模型属性: inertia_ :float
Sum of squared distances of samples to their closest cluster center, weighted by the sample weights if provided.
聚类完成后直接调用即可
"""
kmeans = KMeans(n_clusters=k, init='k-means++',random_state=100)
kmeans.fit(data)
SSE = kmeans.inertia_
轮廓系数
我查了很多资料,这里首先说一下得到的一个结果吧:轮廓系数并不是越高越好
轮廓系数的计算方法,sklearn里面也有,具体的用法和参数大家可以去看官方文档。
from sklearn.metrics import silhouette_samples,silhouette_score
# label 是模型训练后数据的标签
lkxs = silhouette_score(data, labels)
"""
silhouette_samples 返回所有样本的轮廓系数
silhouette_score 返回所有样本的平均轮廓系数
"""
轮廓系数是在[-1,1],很多资料说越接近于1,聚类结果越好,但我在是实验时取的最高的轮廓系数,并没有得到很好的聚类结果。之后我对比了一下轮廓系数和平方误差的图,如下
这是同一属性的两个指标的折线图,可以看到,随着类数量的增加,误差在减小,但轮廓系数却在下降。而轮廓系数最大时,同样误差也最大。
总结
当然并不是所有的数据都是这样,在我实验过程中其他属性的轮廓系数也是会随着误差的减小而升高的,我之前一直纠结于该用哪个指标取K值,现在看来得综合考虑,折中取值。其实我觉得不论哪种指标,他们都是提供一个参考,最后要聚成几类,不能只从数据的角度来定,还要考虑实际需求等情况。
以上仅代表个人观点,如有不妥,欢迎指正。