K均值算法是一个经典的,被广泛使用的聚类算法。
K均值算法中首先选择K个初值。K是用户指定的参数,即希望聚成的簇的个数。每个点指派到最近的质心,指派到一个质心的点集为一个簇。然后更新每个簇的质心,直到簇不发生变化,或质心不发生变化(二者等价),结束算法。
算法: K均值
--------------------
选择K个点作为初始质心。 (STEP 1)
repeat
将每个点指派到最近的质心,形成K个簇。 (STEP 2)
重新计算每个簇的质心。 (STEP 3)
until 质心不再发生变化
将每个点指派到“最近”的质心,需要一个邻近性度量(即距离函数)来量化这个“最近”的概念。通常在欧式空间中的点可以使用曼哈顿距离(L1)或者欧式距离(L2);对于文档可以用余弦相似性或者Jaccard距离等。
对于邻近性度量为欧氏距离的数据,我们使用误差平方和(Sum of the Squared Error, SSE)作为度量聚类质量的目标函数。我们计算每个点到最近所在簇的质心的欧氏距离(该距离也可以称作误差),然后计算误差的平方和。SSE的定义如下:
S
S
E
=
∑
i
=
1
K
∑
x
∈
C
i
d
i
s
t
(
c
i
,
x
)
2
SSE=\sum_{i=1}^{K}\sum_{x \in C_i}^{}dist(c_i,x)^2
SSE=i=1∑Kx∈Ci∑dist(ci,x)2
其中,dist是欧几里得空间中两个对象之间的标准欧几里得距离(L2),
C
i
C_i
Ci是第i个簇,
c
i
c_i
ci是簇
C
i
C_i
Ci的质心。
使簇的SSE最小的质心是均值。
K均值是一种启发式算法,在算法的步骤中,STEP2和STEP3试图最小化SSE。然而这只能确保他们找到关于SSE的局部最优解,因为他们是对选定的质心和簇进行优化,而不是对所有可能的选择来优化SSE。
K均值算法受选取的初始质心的影响很严重。选不同的初始质心会出现不同的结果。
一种常用的技术是多次运行,每次用一组不同的随机初始质心。然后选取具有最小SSE的簇集。
一种方法是使用层次聚类技术。从层次聚类中提取K个簇,用这些簇的质心作为初始质心。缺点:这只适用于样本相对较小同时K相对于样本大小较小的情况。
另一种方法是随机的选取一个点。然后对每个后继初始质心选择距离已经选取过初始质心最远的点。这样可以确保初始质心集合不是随机的,而且是散开的。不过这样的方法可能选中离群点。而不是稠密区域中的点。
K-Means++ 是对K-means的改进,主要是在初始点选取上的改进。基本思想就是K个初始质心离的越远越好。
算法步骤:
步骤一:随机选取一个样本作为第一个聚类中心 c1
步骤二:计算每个样本与当前已有簇中心最短距离(即与最近一个聚类中心的距离),用 D(x)表示;计算每个样本被选为下一个初始质心的概率
D
(
x
)
2
∑
D
(
x
)
2
\frac{D(x)^2}{\sum D(x)^2}
∑D(x)2D(x)2;最后,用轮盘法选出下一个聚类中心;
步骤三:重复步骤二,直到选出 K 个初始质心。
选出初始点后,就继续使用标准的 k-means 算法了。
空间复杂度: O((m+K)n),m是点数,n是属性数。
时间复杂度: O(IKm*n),I是收敛所需要的迭代次数。I通常很小。
在K均值算法中,离群点会影响簇的发现,导致簇的质心不如没有离群点时那样具有代表性,同时SSE也较高。
离群点的处理分为前处理和后处理,前处理是在聚类之前剔除一些离群点。后处理可以在聚类之后记录每个点对SSE的影响,删除那些具有特别大的影响力的点;同时还可以删除那些很小的簇,因为他们常常代表拥有离群点的簇。
聚类结束后,可以使用一些后处理的技术,常用的方法如分裂和合并技术,通过增加或者减少簇降低SSE。
增加簇:
减少簇:
二分K均值是K均值算法的变种。二分K均值的思想是,为了得到K个簇。将所有的点的集合分裂成两个簇,从这些处中根据一些指标(如SSE)选取一个簇继续分裂,如此下去,直到产生K个簇为止。
算法: 二分K均值
--------------------
初始化簇表使之包含由所有的点组成的簇。
repeat
从簇表中取出一个簇。
for i=1 to 试验次数 do {对选定的簇进行多次二分试验}
使用基本K均值二分选定的簇
end for
从二分试验中选择具有最小总SSE的两个簇
将这两个簇添加到簇表中
until 簇表中包含K个簇。
二分K均值不太受初始化问题的影响。
K均值算法可以找到使SSE局部最小的聚类,但是二分K均值仅局部的使用了K均值算法(二分一个簇),最终的结果不代表使SSE局部最小的聚类。
K均值算法中簇的质心一组点的均值。而K中心点算法使用一组点中最具有代表性的点作为质心,根据定义,K中心点中的质心必须是一个实际的数据点。而k均值中的质心不需要对应于一个实际的数据点。
优点: K均值简单耗费空间小,多数情况下相当有效。K均值的某些变种(如二分K均值),不太受初始化问题的影响。
缺点: K均值的目标函数表明他是最小化等尺寸和等密度的球形簇或者可以明显分离的簇,所以他无法处理非球形、不同尺寸、不同密度的簇。对于数据中具有离群点,K君之也不能很好的处理。
Pang-Ning Tan & Michael Steinbach, (2010). 数据挖掘导论. 人民邮电出版社