K-means 学习笔记

来源:互联网 发布:淘宝买家个人消费贷款 编辑:程序博客网 时间:2024/05/16 11:35

1.基本原理

          K-means(K均值)是基于数据划分的无监督聚类算法,是数据挖掘领域的十大算法之一。

       聚类算法可以理解为无监督的分类方法,即样本集预先不知所属类别或标签,需要根据样本之间的距离或相似程度自动分类。聚类算法可以分为基于划分的方法、基于连通性的方法、基于密度的方法、基于概率分布模型的方法等,K-means属于基于划分的聚类方法。

算法步骤如下:

1、初始化聚类中心,随机取k个元素,作为k个簇的各自的中心。

2、计算样本到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。

3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。

4、重复步骤2-3,直到聚类结果小于设定阈值。

int cvKMeans2( const CvArr* samples, int cluster_count, CvArr* labels,                      CvTermCriteria termcrit, int attempts CV_DEFAULT(1),                      CvRNG* rng CV_DEFAULT(0), int flags CV_DEFAULT(0),                      CvArr* _centers CV_DEFAULT(0), double* compactness CV_DEFAULT(0) );
typedef struct CvTermCriteria{    int    type;  /* may be combination of CV_TERMCRIT_ITER  CV_TERMCRIT_EPS */    int    max_iter;    double epsilon;}

2.算法改进

      K-means对聚类中心的初始化比较敏感,不同处世智慧带来不同的聚类结果,这是因为 K-means仅仅是对目标函数求取近似局部最优解,不能保证得到全局最优解,即在一定数据分布下聚类结果会因为初始化的不同产生很大偏差。为了获得较好的聚类结果,可以多次随机初始化聚类中心,得到多组结果进行对比和选择。

      a.K-means++:该算法能够有效产生初始的聚类中心。

基本思路:

1、从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心
2、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较 大
4、重复2和3直到k个聚类中心被选出来
5、利用这k个初始的聚类中心来运行标准的k-means算法

      b.ISODATA算法:该算法与K-means在基本原则上一致,通过计算误差平方和最小来实现聚类,但ISODATA算法在迭代过程中引入类别的合并和分开机制。

      c.Kernel  K-means:针对非标准正态分布和非均匀样本集时,K-means聚类不能得到预期结果,原因在于假设相似度度量为二次欧式距离,在实际的样本集合中该假设不一定都会适用。为了有效克服该局限性假设,K-means需要推广到更广义的度量空间。经典的两种改进框架为Kernel  K-means和谱聚类Spectral Clustering。

      Kernel  K-means 将样本点通过某种映射方式到新的高维空间,在该空间中样本点之间的內积可以通过对应的核函数进行计算。借助核函数的存在,可以再新空间进行K-means聚类,样本之间的相似性度量就取决于核函数的选择。

      谱聚类算法尝试着变换样本的度量空间,首先需要求取样本集合的仿射矩阵,然后计算仿射矩阵的特征向量,利用得到的特征向量进行 K-means聚类。仿射矩阵的特征向量隐含地重新定义样本点的相似性。

      d.二分K-means聚类:按照K-means聚类规则很容易陷入局部最小值,马尔科夫随机场中配置的代价函数不是好的目标函数,为了解决该问题,有人提出二分K-means聚类算法。首先把所有样本作为一个簇,然后二分该簇,接着选择其中一个簇继续进行二分。选择哪一个簇二分的原则就是能否使得误差平方和(SSE)尽可能小。该算法有了好的目标函数,SSE的计算其实就是距离和。

3.算法特点

      K-means聚类简洁快速,假设均方误差是计算群组分散度的最佳参数,对于满足正态分布的数据局聚类效果很好。

      K-means的性能依赖于聚类中心的初始位置,不能确保收敛于最优解,对孤立点敏感。可以采用一些前端方法,首先计算出初始聚类中心,或者每次用不同的初始聚类中心将该算法运行多次,然后择优确定。



参考文献
【1】谢剑斌等著《视觉机器学习20讲》,2015
【2】http://www.cnblogs.com/moondark/archive/2012/03/08/2385770.html
【3】http://blog.csdn.net/qll125596718/article/details/8243404/
【4】http://www.jb51.net/article/49395.htm



0 0