第 10 章 利用K-均值聚类算法对未标注数据分组
10.1 K-均值聚类算法
K-均值聚类
优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
适用数据类型:数值型数据
K-均值聚类伪代码:
创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
10.2 使用后处理来提高聚类性能
在前面一节中,k值由用户预先定义的参数,用户如何知道k值是否正确?如何知道生成的簇比较好?在包含簇分配结果的矩阵中保存着每个点的误差,即该点到簇质心的距离平方值。在这一节中,利用该误差来评价聚类质量。
K-均值算法收敛但聚类效果较差的原因是,K-均值算法收敛到了局部最小值,而非全局最小值(局部最小值指结果还可以但是并非最好结果,全局最小值是最可能的最好结果)。
一种用于度量聚类效果的指标是SSE(Sum of Squared Error, 误差平方和),SSE值越小表示数据点越接近于它们的质心,聚类效果也是越好。因为误差取了平方,所以更加重视那些远离中心的点。越好的聚类SSE应该越小,最简单的降低SSE值方法是增加K值,但这违背了聚类的目标。聚类的目标是在保持簇数目不变的情况下提高簇的质量。
对生成的簇进行后处理,一种方式是将具有最大SSE值的簇分成两个簇,但是这个来带来一个问题:K值增加即簇的数量增多。为了保证簇总数不变,可以将两个簇合并,下面提供了两种可以量化的方法:
- 合并最近的质心:通过计算所有质心之间的距离,然后合并距离最近的两个点来实现。
- 合并两个簇然后计算总SSE值:必须在所有可能的两个簇上重复上述处理过程,直到找到最佳两个簇为止。
10.3 二分K-均值算法
为了克服K-均值算法收敛于局部最小值的问题,有人提出了二分K-均值算法。该算法首先将所有点作为一个簇,然后将该簇一分为二。之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE值。
二分k-均值的伪代码形式:
将所有点看成一个簇
当簇数目小于k时
对于每个簇
计算总误差
在给定的簇上面进行k-均值聚类(k=2)
计算将该簇一分为二之后的总误差
选择使得误差最小的那个簇进行划分操作