kmeans算法

无监督学习,聚类算法

选取K个点作为初始质心:

repeat:

将每个点指派到最近的质心,形成K个类

重新计算每个类的质心

until 质心不在发生变化


计算点到质心的方法:

1.欧氏距离:欧氏空间中的数据

2.哈曼顿距离:

3.余弦相识度:常用于文本数据


最小化目标函数:最小化误差平方和。

数据到该类中心聚类距离平方和


简单,K值不好选取,随机性比较大

K的选取:

1.多次随机选取,选取误差平方和最小的那个质心

2.?

初始中心的选取

1.随机选取

2. 计算每一维特征的最大值和最小值,max min ,该维度的中心选取方式为: min + (max - min)*random(0,1)

其他维度同理


二分K均值

简单思想:为了得到K个簇,将所有的点集合分成两个类簇,从这些簇中选取一个继续分裂,如此下去,直到参生K个簇。

算法流程:

1,初始化类簇,使之包含所有点组成的簇

2,repeat:

2.1从簇表中选取一个类簇

2.2{对选定的类簇多次二分“试验”}

2.2.1for i = 1 to 测试次数 do

2.2.2使用基本K均值,二分选定的簇

2.2.3end for

2.3 从二分试验中选取具有最小总SSE的两个簇

2.4将这两个簇添加到簇表中

2.5until 簇表中包含K个簇

注意:

2.1从簇表中选取一个类簇:选取类簇的方法:

(1)最大的簇

(2)最大SSE的簇

(3)基于最大和SSE的标准选择类簇

实验中通常,使用结果簇的质心作为基本K均值的初始中心,对结果簇逐步求精。

因为在二分K均值算法中只是局部地使用kmeans算法,即其中的二分簇时。


看到下面另外一种kmeans改进算法

K-Means ++ 算法

k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。

1.从输入的数据点集合中随机选择一个点作为第一个聚类中心

2.对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)

3.选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大

4.重复2和3直到k个聚类中心被选出来

5.利用这k个初始的聚类中心来运行标准的k-means算法

从上面的算法描述上可以看到,算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:

1.先从我们的数据库随机挑个随机点当“种子点”

2.对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。

3.然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。

4.重复2和3直到k个聚类中心被选出来

利用这k个初始的聚类中心来运行标准的k-means算法

可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因比较简单,如下图 所示:

假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。

来源链接:http://blog.csdn.net/lonelyrains/article/details/50916152

你可能感兴趣的:(kmeans算法)