基本算法:
1:选择K个点作为初始质心
2:repeat
3:将每个点指派到最近的质心,形成K个簇。
4:重新计算每个簇的质心。
5:until 质心不发生变化。
存在的问题:
初始质心的选择。如果一个簇对只有一个质心,那么将只能得到次最优结果。解决的办法有(1)多次运行,选择不同的质心,选择能够产生较好结果的那一次运行。(2)先对对象进行抽样,对抽样结果进行层次聚类,在层次聚类结果中选择质心。(3)选择质心的时候尽量选择与已有质心更远的点,这样可以保证选择到的质心是分散的。
优化:
- 处理空簇。对于得到的空簇,需要选择一个候补质心,一种方法是选择一个距离当前所有质心最远的点。另一个办法是从最大sse簇中选择一个候补执行难,这样可以降低总的sse。
- 离群点。离群点往往会导致比较高的sse,常见的做法是提前发现并删除它们。但是在某种情况下要注意,明显的离群点可能是最令人感兴趣的点。
- 后处理降低sse。适当地分裂与合并簇或者新增和取消簇。(1)选择具有最大sse或者特定属性最大标准差的簇进行分裂。(2)引进新的质心,可以选择离所有簇质心最远的点,另外的办法可以从所哟点或者具有最高sse的点种随机选择。(3)拆散一个簇,将该簇的质心删除,其对象指派到其他簇。理想情况下这可以使得总sse增加最少。(4)合并簇。尽量使得合并导致的sse增加最少。
- 增量地更新质心。就是在每次点到簇的指派之后,增量地更新质心。
二分K均值
算法流程:
1:初始化簇表,使之包含由所有的点组成的簇。
2:repeat
3:从簇表中取出一个簇。
4:{对选定的簇进行多次二分试验}
5:for i=1 to 试验次数 do
6:使用基本K均值,二分选定的簇
7:end for
8:从二分试验中选择具有最小总sse的两个簇。
9:将这两个簇添加到簇表中。
10:until 簇表中包含K个簇。