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