k-meas算法

k-means & KNN

k-means与kNN虽然都是以k打头,但却是两类算法——kNN为监督学习中的分类算法,而k-means则是非监督学习中的聚类算法;
二者相同之处:均利用近邻信息来标注类别。

k-means基本算法

在k-means算法中,用质心来表示cluster;且容易证明k-means算法收敛等同于所有质心不再发生变化。基本的k-means算法流程如下:

选择K个点作为初始质心  
repeat  
将每个点指派到最近的质心,形成K个簇  
重新计算每个簇的质心  
until 簇不发生变化或达到最大迭代次数 

k-meas算法_第1张图片
对于欧式空间的样本数据,以平方误差和(sum of the squared error, SSE)作为聚类的目标函数,同时也可以衡量不同聚类结果好坏的指标:

SSE=i=1kxCidist(x,ci)2 S S E = ∑ i = 1 k ∑ x ∈ C i d i s t ( x , c i ) 2
表示样本点 x x 到cluster Ci C i 的质心 ci c i 距离平方和。
最优的聚类结果应使得SSE达到最小值。
找到使SSE最小的聚类结果后,确定结果中每个簇的质心:
对于距离度量,不管是采用哪种距离公式(欧式距离、曼哈顿距离、闵可夫斯基距离 等),簇的质心都是其均值(除了曼哈顿距离是中位数),即向量各维取平均即可。

那么为什么我们更新质心是根据簇中所有的点的平均值呢?这里就是SSE所决定的,证明如下:

ckSSE=cki=1KxCi(cix)2=i=1KxCick(cix)2=xCk2(ckxk)=0 ∂ ∂ c k S S E = ∂ ∂ c k ∑ i = 1 K ∑ x ∈ C i ( c i − x ) 2 = ∑ i = 1 K ∑ x ∈ C i ∂ ∂ c k ( c i − x ) 2 = ∑ x ∈ C k 2 ( c k − x k ) = 0
xCk2(ckxk)=0mkck=xCkxkck=1mkxCkxk ∑ x ∈ C k 2 ( c k − x k ) = 0 ⇒ m k c k = ∑ x ∈ C k x k ⇒ c k = 1 m k ∑ x ∈ C k x k
这样,正如前面所指出的,簇的最小化SSE的最佳质心是簇中各点的均值。

k-means算法的缺陷

  • k-means是局部最优的,容易受到初始质心的影响;不同的随机种子点得到的聚类结果完全不同。
  • k值的选取也会直接影响聚类结果,最优聚类的k值应与样本数据本身的结构信息相吻合,而这种结构信息是很难去掌握,因此选取最优k值是非常困难的。

K-Means优化算法

为了克服K-Means算法收敛于局部最小值的问题,提出了一种二分K-均值(bisecting K-means)。

二分k-means的主要思想

一个大cluster进行分裂后可以得到两个小的cluster;为了得到k个cluster,可进行k-1次分裂。

二分k-means的算法流程

将所有的点看成是一个cluster
repeat:
从待分裂的clusters中选择一个进行二元分裂,所选的cluster应使得总误差SSE最小;
until 有k个cluster

参考:
https://blog.csdn.net/taoyanqi8932/article/details/53727841
https://www.cnblogs.com/en-heng/p/5173704.html

你可能感兴趣的:(机器学习系列,算法总结)