聚类是一种无监督的学习,它将相似的对象归为同一个簇中。之所以成为k均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。
聚类分析视图将相似对象归入同一簇,将不相似对象归到不同簇。相似这一概念取决于所选择的相似度计算方法。前面介绍的各种相似度计算方法后面还会出现,而到底用那种相似度方法取决于具体应用。
下面我们会构建k均值方法并观察期实际效果,然后讨论简单k均值算法中的缺陷。为了解决其中的一些缺陷,可以通过后处理来产生更好的簇。接着会给出一个更有效的称为二分k均值的聚类算法。最后给出一个实例应用。
10.1 k均值聚类算法
k均值是发现给定数据集的k个簇的算法。簇的个数k是用户给定的,每个簇通过其质心,即簇中所有点的质心来描述。
k均值算法的工作流程:首先,随机确定k个初始点为质心。然后将数据集的每个点分配到一个簇,具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇,这一步完成之后,每个簇的质心更新为该簇所有点的均值。
求与某数据点最近的质心意味着要进行某种距离计算,这里使用的是欧氏距离。此外,初始的k个随机质心需要在整个数据集边界范围之内。对数据集进行画图如下:
PS:画个图也费我老半天时间额~郁闷~
算法主要就是计算质心-分配-重新计算,不断迭代,直到所有数据点的簇分配结果不再改变为止。最后算法返回两个矩阵:centroids有k行n列,用来装质心数据,k行表示k个质心,n行表示质心数据维度。clusterAssment有m行2列,m行对应数据集中m个数据点,第一列记录该数据点所在簇索引值,第二列记录该数据点与所在簇质心的距离,即存储误差。
PS:python神操作:数组b赋值给矩阵a,则a成了数组类型并得到相应的值。而数组b赋给矩阵a的某一列后,数据a还是矩阵,并得到了b的对应值。此外,数组可以与某一个数加减乘除,结果是数组的对应元素与这个值加减乘除。最后,random.rang(m,n)生成m行n列数组,数组元素是0到1之间的随机数。
10.2 使用后处理来提高聚类性能
在k均值聚类中簇的数目k是一个用户预先定义好的参数,而用户并不知道该设置成多少为最好。在包含簇结果的矩阵中保存着每个点的误差,即该点到簇质心的距离平方值。下面我们可以用该误差来评价聚类质量的方法。
k均值算法收敛但聚类效果较差的原因:k均值算法收敛到局部最小值,而不是全局最小值。
一种用于度量聚类效果的指标是SSE(误差平方和),即clusterAssment矩阵的第一列之和,SSE值越小表示数据越接近它们的质心,聚类效果也越好。一种肯定可以降低SSE值的方法是增加簇的个数,但是这违背了聚类的目标,聚类的目标是在保持簇不变的情况下提高簇的质量。
所以,我们应该对簇进行后处理,一种方法是将具有最大SSE的簇划分成两个簇,具体实现就是将最大簇包含的点过滤出来,然后再这些点上运行k均值算法,k设为2。而为了保持簇的总数不变,可以将某两个簇合并,那么又该按照什么依据合并呢?
有两种量化办法:第一种,合并最近的质心,即计算所有质心之间的距离,然后合并最近的两个质心。第二种,合并两个使得SSE增幅最小的质心,即合并两个簇然后算总SSE值,这需要在所有可能的两个簇上重复上述操作,知道找到合并最佳的簇为止。
10.3 二分k均值算法
为了克服k均值算法收敛于局部最小值的问题,有人提出了二分k均值算法,该算法首先将所有点作为一个簇,然后将该簇一分为二,之后选择其中一个簇继续一分为二,选择哪个簇取决于对其划分是否可以最大程度降低SSE的值。上述划分过程不断重复,直到得到用户指定的簇数为止。
另一种做法是选择SSE最大的簇进行划分,直到簇的数目达到用户指定的数目为止。
下面的操作是对第一种方法的实现,即划分依据是降低划分后总的SSE值。代码思路很简单,就是对所有的簇都进行k均值划分,然后计算总SSE值,找到能使SSE值最小的划分簇,将其划分,将被划分簇的质心矩阵和误差矩阵加入总数据集的质心矩阵和误差矩阵,直到簇的个数满足用户指定的参数。
下面给出用二分k均值算法进行划分后的结果图:
此次划分用的数据与上一张图一样,只是方法不同:前面用的是k均值聚类算法,初始质心是随机选取的,划分后得到的效果并不好,这从图上就能看出来。而这里用的是二分k均值算法,是从一个簇不断划分而来,划分结果明显比上一张好些。
下面我又用二分k均值聚类算法在另一个数据集做了划分,结果如下:
划分结果~外瑞固的~
10.4 本章小结
聚类是一种无监督学习方法。所谓无监督学习方法,就是事先不知道要寻找的内容,即没有目标向量。聚类将数据点归到多个簇中,其中相似的点处于同一个簇,而不相似的点处于不同的簇中。聚类可以使用多种不同的方法来计算相似度。
一种广泛使用的聚类方法是k均值算法,其中k是用户指定的要创建的簇的数目。k均值聚类算法以k个随机质心开始。算法会计算每个点到质心的距离。每个点会分配到距其最近的簇质心,然后紧接着基于新分配到簇的点更新簇质心。以上过程重复数次,直到簇质心不再改变。
这个方法简单有效,但容易受到初始簇质心的影响。为了更好的聚类效果,可以使用一种称为二分k均值的聚类算法。
二分k均值聚类算法首先将所有点作为一个簇,然后使用k均值算法(k=2)对其划分。下一迭代时,选择有最大误差的簇进行划分。该过程重复直到k个簇创建成功为止。
二分k均值的聚类效果要好于k均值算法。
over~ ^_^