K-means优化 (Kmeans++, ISODATA, Kernal k-means)

1. Kmeans++

原始的kmeans算法随机的选取数据中的k个点作为聚类中心,因此每次聚类的效果可能会有很大的区别,而且初始点选的不好,会很大程度上影响聚类的结果,为了解决此问题引入了K-means++,它的核心思想是:

    a, 在数据集上随机选取一个样本点作为第一个初始化的聚类中心

    b, 按照下面思路选择出其余的聚类中心:(聚类中心相互距离越远越好)

        计算每个样本点距已经初始化的聚类中心之间的距离,并选择其中最短的距离d(x),(即距离最近聚类中心的距离)

        以概率选择距离最大的样本作为新的聚类中心 (距离当前聚类中心越远的点有更高的概率),重复上述过程,直到k个聚类中心都被确定

                                                   p=d(x)^2/sum(d(x)^2) (最短距离平方/最短距离平方和)

    c, 然后按照普通的K-means算法进行聚类

2. ISODATA

原始的k-means有一个问题是,k值需要预先人为确定,并且在整个算法中无法更改,当遇到高维度,和数据量较大时,一般很难确定k值得大小。ISODATA就是根据此问题的改进,它的核心思想是:

    当属于某个类别的个体过多时把这个类别去掉(合并操作),反之当某个类别的样本数过多,分散程度过大时,把这个类别分位两个子类别(分裂操作)。

ISODATA输入:

    a, 预期的Ko值:还是需要用户输入K值得变动范围【Ko/2,2Ko】

    b, 每个类所要求的最少样本数Nmin:分裂操作的阈值,当样本分散程度较大需要进行分裂时,必须保证分裂后的样本数大于Nmin,合并操作的阈值,当类别样本小于Nmin,需要进行合并。

    c, 最大方差Sigma: 衡量样本的分散程度,当样本的分散程度大于Sigma时就有可能进行分裂操作。

    d, 两个聚类中心允许的最小距离dmin:合并操作的阈值,当两个聚类中心小于dmin,则需要对这两个聚类进行合并

相比kmeans和kmeans++, ISODATA需要额外指定较多的参数,并且某些参数同样很难确定指出一个合理的值,因此ISODATA实际使用中并没有K-means++受欢迎。

具体算法步骤:

  1. 随机选择Ko个样本作为聚类中心
  2. 对于每个样本xi,计算到每个聚类中心的距离,并分配到距离最小的cluster中
  3.  判断每个cluster中样本数目是否小于Nmin,如果小于Nmin丢弃该cluster,并将其元素分配到最近的cluster中。
  4.  重新计算每个类的聚类中心
  5.  如果K <= Ko/2, cluster太少,需要进行分裂操作
  6.  如果K >= 2Ko. Cluster 太多,需要合并
  7.  跳转至2,直到达到最大迭代次数,

分裂操作

  1. 计算每个类别下所有样本的方差
  2. 选出最大的方差\sigma_{max}:
  3. 如果某个类的方差\sigma_{max}: >Sigma, 并且该类包含样本数目>=2Nmin, 则进行分裂,并前往步骤4
  4. K=K+1, 更新聚类中心,mi1 = mi + \sigma_{max},  mi2 = mi - \sigma_{max}:

合并操作

  1. 计算当前聚类中心两两之间的距离D(i,j)
  2. 当D(i,j) < dmin, 需要进行合并,合并后的聚类中心位置为:

                  Mnew = (nimi + njmj) / (ni + nj),

          ni和nj分表表示两个类别中的样本个数,mi和mj分表表示两个类原本的聚类中心,新的聚类中心可以看作是对这两个类别进行加权求和,若果一个类所包含的样本数较多,所合成的新类就会更偏向它。 

3. kernal Kmeans:

传统K-means采用欧氏距离进行样本间的相似度度量,但是并不是所有的数据集都适用这种度量方式,参考SVM中和函数的思想,Kernal Kmeans 就是将所有样本映射到另一个特征空间在进行聚类,就能解决此问题。

猜你喜欢

转载自blog.csdn.net/bob421559385/article/details/86571216
今日推荐