K均值(KMeans)

来源:互联网 发布:thttpd Windows 编辑:程序博客网 时间:2024/05/16 15:32

基本算法:

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个簇。

原创粉丝点击