码迷,mamicode.com
首页 > 其他好文 > 详细

聚类学习笔记——kmeans

时间:2014-10-13 23:20:57      阅读:1672      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   使用   ar   

kmeans是数据挖掘领域最为常用的聚类方法之一,最初起源于信号处理领域。它的目标是划分整个样本空间为若干个子空间,每个子空间中的样本点距离该空间中心点平均距离最小。因此,kmeans是划分聚类的一种。

方法简单易懂,也很有说服力。但,不幸的是,这是一个NP-hard问题。

首先来看一下NP问题。NP即Non-Deterministic polynomial,非确定性多项式。这里隐含着两个概念,即多项式问题及非确定性问题。
众所周知,一个问题的复杂度是该问题的实例规模n的多项式函数,因此可以在多项式时间内解决的确定性问题称为P问题;非确定性问题相对难以理解,举个例子,有些问题比如加减乘除,我们可以通过推导,一步步的运算得到结果;但是,还有些问题,我们只能通过间接的猜算来得到结果。比如求取质数,没有一个公式可以直接得到下一个质数,这样的问题就叫做非确定性问题。
上一个质数的例子中,有一个替代的算法是我们可以验证一个数是不是质数,这样通过验证一定能在多项式时间内猜到这个解,就是多项式非确定性问题,即NP问题。进一步,因为我们找不到np问题的直接算法,就有人提出了是否可以不断归约小的np问题为稍微复杂的大的np问题,最终,通过提出一个超级NP问题,所有np问题都可以约化为这个问题,那么,只要解决了这个问题,就解决了所有np问题。这就是NPC问题。值得注意的是,这种问题的算法复杂度呈指数增长,随着问题复杂度的增加,很快就无法计算了。
如果我们找到一个NPC问题的多项式算法,那么所有的np都能在多项式时间内解决,np问题就变成了p问题,这就是NP=P?的猜想,悬赏百万美圆的千禧难题之首。
NP-hard问题同样难以找到多项式算法,但是它不限定于NP问题。
bubuko.com,布布扣

算法

了解了NP-hard问题之后,我们知道为kmeans计算起来相当困难。好在,有一些被广泛应用的启发式算法,可以快速有效的找到局部最优解:
  1. 随机取k个点作为种子点,每个种子点代表一个类并作为该类的中心点;
  2. 计算每个样本点到种子点的距离,把样本点归到距离最近的类中,划分出k个类;
  3. 重新计算每个类的平均值作为新的种子点的位置;
  4. 迭代2-3,直到种子点不在移动。

距离度量

上面的算法可以看出,距离公式是影响算法的核心因素。这里我们首先讨论距离公式的选取。
Minkowski距离
Minkowski距离是衡量数值点之间距离的一种常见方法,假设数值点$P=(x_1,x_2,...,x_n)$和$Q=(y_1,y_2,...,y_n)$,则minkowski距离定义为:
$$(\sum_{i=1}^{n}|x_i-y_i|^p)^{1/p}$$
通过调节参数p,可以得到不同的距离表现形式。最常用的1和2,前者是Manhattan距离,后者为Euclidean距离。如下图所示,如白色表示高楼,灰色为街道。乘坐出租车从P点到Q点,绿色的斜线表示Euclidean距离(不实际),其他几条线段表示Manhattan距离。
bubuko.com,布布扣
当p趋于无穷大,转化为Chebyshev距离:
$$\lim_{p\rightarrow\infty}(\sum_{i=1}^{n}|x_i-y_i|^p)^{1/p}=\mathop{Max}_{i=1}^n|x_i-y_i|$$
Chebyshev距离的物理意义可以想象为,国际象棋中的王,既可以直着横着走,也可以斜着走,那么从A格前往B格,走的最少的步数就是Chebyshev距离。
我们都知道,平面上到原点的欧几里得距离为1的点组成图形为圆形,当p取其他值时如下图:
bubuko.com,布布扣
以平面点的聚类为例,如果把原点想象成种子点,那么,通过选取不同的p,距离最近的点的分布也不相同,即类的覆盖范围呈上图的形状。
若x,y轴分别代表样本的两种特征,显然,当$p<1$时,如果x方向的幅值远远大于y方向,minkowski距离会过度放大特征x的作用。这就要求我们应该在聚类前对数据进行必要的预处理,或者根据需要给特征不同的权重。稍后将介绍几种常见的预处理方法。
Minkowski距离的缺点也是显而易见的
  1. 各个特征的量纲同等看待;
  2. 各个特征的分布默认相同。
Mahalanobis距离
马氏距离测度一个点P与一个分布D之间的距离测度。它的主要思想是测量P相对D的均值的标准差。有两个优点:
  1. 量纲无关;
  2. 排除特征间相关性的干扰。
定义:有m个样本向量$X=(x_1,x_2,...,x_m)$,协方差矩阵记为S,均值即为向量$\mu$,则其中样本向量X到$\mu$的马氏距离:
$$D(X)=\sqrt{(X-\mu)^TS^{-1}(X-\mu)}$$
而其中向量$x_i$与$x_j$的马氏距离定义为:
$$D(x_i,x_j)=\sqrt{(x_i-x_j)^TS^{-1}(X_i-X_j)}$$
若协方差矩阵S为单位阵(各样本向量间独立同分布),则公式变成欧式距离;
若协方差矩阵式对角阵,公式是标准化欧式距离。
cos相似度
余弦相似度为空间中两个向量的夹角度量,相比前面的距离公式,它更注重个体间趋势的差异。例如,A=(3,3),B=(5,5),用余弦相似度测量的话,两者没有区别。

收敛分析

到这里,整个kmeans方法已经介绍完毕。我们已经可以让算法运行下去,但是,算法是否每次都能成功收敛,即满足条件后停止,需要进一步讨论。
定义畸变函数(distortion function)
$$J(c,\mu)=\mathop{\sum}_{i=1}^m||x_i-\mu_{c^i}||^2$$
J函数为每个样本点到其种子点的距离平方和。Kmeans即是要最小化J。我们可以首先固定类别c,调整样本点的所属的类别$c^i$让J变小;然后可以固定$c^i$,调整种子点让J减小。显然,当J有界,由于J是非凸函数,kmeans只能得到局部最优解,是一个coordinate descent优化问题。也就是说kmeans对种子点的初始选取比较敏感。但一般情况到达局部最优已经满足要求,如果怕陷入局部最优,那么可以选择不同的初始值多跑几遍,然后选最小J对应的结果作为输出。

注意问题

从收敛分析已经可以看出kmeans对初始值的选取比较敏感,即我们该如何选取合适的种子点的数量及其位置呢?
K的确定
首先说数目,下面给出几个常用的方法:
  1. 与层次聚类结合。通常是采用层次聚类算法决定结果粗的数目,并找到一个初始聚类,然后利用迭代重定位来改进聚类;
  2. 稳定性方法。对数据集进行两次采样产生两个数据子集,使用相同的聚类方法分别聚类,计算两个聚类结果相似度的分布情况。具有较高相似度,说明k个聚类反映了稳定的聚类结构。反复试探,直至找到合适的K;
  3. canopy算法。聚类最耗费计算的地方是计算对象相似性的时候,Canopy首先选择简单、计算代价较低的方法计算对象相似性,将相似的对象放在一个子集中,这个子集被叫做Canopy。通过一系列计算得到若干Canopy,Canopy之间可以是重叠的,但不会存在某个对象不属于任何Canopy的情况,可以把这一阶段看做数据预处理。然后,在各个Canopy 内使用传统的聚类方法(如K-means),不属于同一Canopy 的对象之间不进行相似性计算。
    从这个方法起码可以看出两点好处:首先,Canopy 不要太大且Canopy 之间重叠的不要太多的话会大大减少后续需要计算相似性的对象的个数;其次,类似于K-means这样的聚类方法是需要人为指出K的值的,通过得到的Canopy 个数完全可以作为这个K值,一定程度上减少了选择K的盲目性。
  4. 贝叶斯信息准则
种子点的选取
  1. 随机选取初始位置。可以运行多次比较结果,选取具有最小J值的方案;
  2. 随机选一个点,或者所有点的质心作为种子点。然后,对于每一个后继种子点,选取与前面所有种子点最远的点。这样,不仅确保是初始点是随机,并且是散开的。但是这种方法容易选到离群点。

适用范围及缺陷

Kmeans算法试图找到使平均误差准则函数最小的簇。当潜在的簇形状是凸面的,簇与簇之间区别较明显,且簇大小相近时,其聚类结果较理想。而且,对于处理大数据集合,该算法非常高效,且伸缩性较好。
但是,该算法除了要事先确定簇数K和对初始聚类中心敏感外,经常以局部最优结束,同时对“噪声”和孤立点敏感,并且该方法不适于发现非凸面形状的簇或大小差别很大的簇。

扩展

针对以上的缺陷,很多研究者提出了相应的对策。
kmeans++
即上述种子点选取的第二种方法。
kmedoids(PAM,Partitioning Around Medoids)
能够解决kmeans对噪声敏感的问题。kmeans寻找种子点的时候计算该类中所有样本的平均值,如果该类中具有较为明显的离群点,会造成种子点与期望偏差过大。例如,A(1,1),B(2,2),C(3,3),D(1000,1000),显然D点会拉动种子点向其偏移。这样,在下一轮迭代时,将大量不该属于该类的样本点错误的划入该类。
为了解决这个问题,kmedoids方法采取新的种子点选取方式,1)只从样本点中选;2)选取标准能够提高聚类效果,例如上述的最小化J函数,或者自定义其他的代价函数。
但是,kmedoids方法提高了聚类的复杂度。
Gaussian mixture
实际上,Gaussian Mixture Model(GMM)也是很流行的聚类方法,详细的内容以后再讲。因为它和Kmeans比较像,在这里提一下。
kmeans为每个样本点指派一个类别,要么属于这个类,要不不属于,因此成为硬聚类。GMM可以看作kmeans的软聚类版本,即每个样本点以一定的概率属于某个类别。基本思想是使用EM算法使似然函数最大化(类似最小化J函数),但是保留类的概率分布代替直接指派属于哪个类,并且使用高斯分布代替平均值的计算。




聚类学习笔记——kmeans

标签:des   style   blog   http   color   io   os   使用   ar   

原文地址:http://www.cnblogs.com/ethanCao/p/e6052de074db56a4083bd16fe3b05c68.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!