设X={x_1,x_2,…,x_n },Y={y_1,y_2,…,y_n },其中X,Y是两个元素项,各自具有n个可度量特征属性,那么X和Y的相异度可定义为:
相异度是两个元素对实数域的一个映射,所映射的实数定量表示两个元素的相异度。当元素的所有特征属性都是标量时,可以用距离来作为相异度,最常用距离有欧式距离:
曼哈顿距离:
闵可夫斯基距离:
聚类问题定义:给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高。其中每个子集叫做一个簇。聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。目前聚类广泛应用于统计学、生物学、数据库技术和市场营销等领域。K-means算法是一种最简单的聚类算法。
上图中有七个样本点,将其分为两类(K=2),如何聚类?
算法求解过程如下图所示:
这里给出算法的一个演示地址:http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/AppletKM.html。
由上面的算法过程知K-means的结束条件是收敛,而K-means完全可以保证收敛性。定义畸变函数如下:
J函数表示每个样本点到其质心的距离平方和。K-means是要将J调整到最小。假设当前J没有到最小值,那么首先固定每个类的质心u_j,调整每个样例的所属类别c^((i))来让J函数减小。同样,固定类别调整每个类的质心也可以使J减小。由于J函数是非凸函数,因此不能保证所取的最小值为全局最小值,但一般局部最优已满足要求。若害怕陷入局部最优,可以取不同的初始值多跑几次,取最小的J对应的u和c。
K-means算法优点是简单实用,确定的K 个划分到达平方误差最小。当聚类是密集的,且类与类之间区别明显时,效果较好。对于处理大数据集,这个算法是相对可伸缩和高效的,计算的复杂度为O(NKt)(其中N是数据对象的数目,t是迭代的次数。一般来说,K<<N,t<<N)。
K-means算法缺点主要和K的选取以及初始质心的选取有关:
K-means++算法挑选种子点的基本思想是随机挑选并尽量使各种子点间的距离比较远。D(x)数组存储了每个点到离它最近的种子点的距离,若我们在x轴的正轴方向依次表示数组中的元素,则最后的点表示的值就是sum,Random值会落在区间[0,sum]中,并且对于数组元素值大的对应的线段,Random落在其中的概率也越大,即新选出的“种子点”距离已有种子点远的概率也越大。
k-means和k-means++对于初始点选取的差异如下图所示:
k-means初始点选取
k-means++算法初始点选取
K-means对噪声很敏感。K-means寻找新的类簇中心点时是对某类簇中所有的样本点维度求平均值。当聚类的样本点中有“噪声”(离群点)时,在计算类簇质点的过程中会受到噪声异常维度的干扰,造成所得质点和实际质点位置偏差过大,从而使类簇发生“畸变“。如:类簇C1中已经包含点A(1,1)、B(2,2)、C(1,2)、D(2,1), 假设N(100,100)为异常点,当它纳入类簇C1时,计算质Centroid((1+2+1+2+100)/5,(1+2+2+1+100)/5)=centroid(21,21),此时可能造成了类簇C1质点的偏移,在下一轮迭代重新划分样本点的时候,将大量不属于类簇C1的样本点纳入,因此得到不准确的聚类结果。K-medoids提出了新的类簇中心点选取方式,改善了噪声的影响。
在K-medoids算法中,每次迭代后的质点都是从聚类的样本点中选取,而选取的标准就是当该样本点成为新的质点后能提高类簇的聚类质量,使得类簇更紧凑。该算法使用绝对误差标准来定义一个类簇的紧凑程度:
如果某样本点成为质点后,绝对误差能小于原质点所造成的绝对误差,那么K-medoids算法认为该样本点是可以取代原质点的,在一次迭代重计算类簇质点的时候,我们选择绝对误差最小的那个样本点成为新的质点。
K-medoids能有效地处理数据集中的噪声数据,聚类结果优于K-means。但是由于每次选取中心点都要计算样本点到中心点的距离,时间复杂度增高为O(k(n-k)^2 )。因此,K-medoids只适用于有噪声数据的小数据集。