19.1 使用K-Means聚类算法
问题描述
要把观察值聚类为k个分类。
解决方案
使用K-Means聚类算法:
讨论
K-Means聚类是最常见的一种聚类算法。在K-Means聚类中,算法试图把观察值分到k个组中,每个组的方差都差不多。分组的数量k是用户设置的一个超参数。具体来讲, K-Means算法有如下几个步骤:
1.随机创建k个分组(即cluster)的“中心”点。
2.对于每个观察值:
(1)算出每个观察值和这k个中心点之间的距离。
(2)将观察值指派到离它最近的中心点的分组。
3.将中心点移动到相应分组的点的平均值位置。
4.重复步骤2和3,直到没有观察值需要改变它的分组。这时该算法就被认为已经收敛,而且可以停止了。
关于K-Means算法,有3点值得注意。第一,K-Means聚类假设所有的聚类是凸形的(比如,圆形或者球形)。第二,所有特征在同一度量范围内。在解决方案中,我们对特征进行了标准化,以满足这个条件。第三,分组之间是均衡的(即每个分组中观察值的数量大致相等)。如果你认为自己无法满足这些假设,就可能需要尝试其他的聚类方法。
在scikit-learn中,K-Means聚类是通过KMeans类来实现的。其中最重要的参数就是n_clusters,它设定聚类的数量k。在有些情况下,数据本身的特性可以决定k的值(例如,学校中学生的数据就是一个年级为一个聚类),但是我们往往并不知道聚类的数量。在这些情况下,我们希望可以基于一些条件来选择k值。例如,轮廓系数(silhouette coefficient,参见11.9节)衡量的是同类中的相似度和不同类之间的相似度的比值。
而且因为K-Means算法的计算开销很大,所以可能要使用计算机所有的内核,我们可以设置n_jobs = -1来实现这一点。
在解决方案中,我们使用的是鸢尾花数据集,但是耍了一点小花招:我们知道这个数据集有3个分类,因此设置k = 3。用labels_方法可以查看每个观察值的预测分类:
如果拿这个预测分类跟观察值的真实分类进行比较,就会发现K-Means做得还不错:
但是正如你想的,如果分类的数量设置错了,那么K-Means的表现就会急剧下降。
最后,像scikit-learns的其他方法一样,我们可以使用训练好的分类来预测新观察值的分类:
这个观察值被预测为离某个分类的中心点距离最近的分类。可以使用cluster_centers_来查看这些中心点:
延伸阅读
●《K-Means聚类简介》(DataScience.com,http://bit.ly/2Hjik1f)
本书评论