K-Means算法

来源:互联网 发布:maven java目录下的xml 编辑:程序博客网 时间:2024/06/03 23:28

K-MEANS算法

K-MEANS算法用质心定义原型,其中质心是一组点的均值。

算法步骤

1.随机选择K个点作为初始质心

这是一种常见的选择质心的方法,但是簇的质量常常很差

  1. 取一个样本,并使用层次聚类技术对它聚类,从层次聚类中提取K个簇,并用这些簇的质心作为初始质心

  2. 随机地选择第一个点,或取所有点的质心作为第一个点,选择离已经选取过的初始质心最远的点作为一个个后续的初始质心

  3. 二分K均值

  4. 使用后处理来修补所产生的簇集

2.将每个点指派到最近的质心

计算每个点与每个质心的相似度:如果数据在低维度空间里,许多相似度计算都可以避免

3.重新计算每个簇的质心直到质心不发生变化

目标函数:平方误差和SSE

SSE=i=1Kcidist(Ci,X)2

问题处理

K值的选择

K值的不确定是KMEANS算法的一个缺点,另一个是质心的选择。如果我们不能凭借经验来确定K的值的时候,可以尝试采取以下方法来确定K:

  • 观察法:直接进行观察,如果遇到高维数据则降维
  • 均方法:K=m2
  • Elbow法(肘方法):通过作图找出误差急速下降的拐点K

初始质心的选择

如果初始质心选择不当的话很有可能导致聚类效果不佳或者收敛速度慢。但是我们可以用k-means++来解决这个问题,其算法原理为:

  • 先从所有样本点中随机地选取第一个中心点,将其加入list
  • 再计算所有剩下的点到这个候选质心的距离
  • 选择距离较大(注意不是最大)的点作为下一个质心点
  • 重复上述过程知道产生K个质心点

这种算法虽然解决了后续质心选择的问题,但是依然没有解决初始质心选择随机的问题。

空簇

如果所有的点在指派的步骤都未分配到某个簇,就会形成空簇

  1. 选择一个距离当前任何质心最远的点作为替补质心
  2. 从具有最大SSE的簇中选择一个替补质心

离群点

尽量识别并删除

用后处理来修补簇

  1. 分裂一个簇,通常选择具有最大SSE的簇,或者在特定属性上具有最大标准差的簇
  2. 引进一个新的质心,记录每个点对SSE的贡献,确定离所有簇质心最远的点;从所有的点或者具有最高SSE的点钟随机地选择
  3. 拆散一个簇,删除一个簇的质心,并将簇中的点重新指派到其他簇
  4. 合并一个簇,选择质心最接近的两个簇进行合并

二分K均值

为了得到K个簇,将所有的点的集合分裂成两个簇,从这些簇中选取一个继续分裂,如果下去,直到产生K个簇。

待分裂的簇有许多种不同的选择方法:个数最多的簇或者SSE最大的簇

K均值优点:简单易用,不受初始化质心的影响,如果K足够大,能发现纯子簇
K均值缺点:不适合处理非球形簇,不同尺寸和不同密度的簇

原创粉丝点击