kmeans是很经典的一种聚类方法,也比较简单,本文主要记录kmeans的思路,代码以后再补。
主要参考资料:
wiki
http://en.wikipedia.org/wiki/K-means_clustering
漫谈clustering之kmeans
http://blog.pluskid.org/?page_id=78
1,简介
a.目标:
kmeans算法是要将空间中N个点划分到k个类别中,使得每个点与它所属的类别的中心点的距离最近。
对于一幅图片中的像素点做kmeans聚类,结果如下:
b.描述(from wiki):
(x1,x2,...xn)是观测值的一个集合,其中每个x都是一个d维向量;
Si代表每个类别,μi是Si的聚类中心点;
kmeans算法就是要将N个点划分到k个类别中,使得小组内部距离平方和WCSS(within-cluster sum of squares)最小,即满足下式:
c.性质:kmeans算法是无监督的,是自下而上的聚类。
2,初始化
首先要选定k个点作为初始聚类。
Forgy方法:随机从数据集中选k个observation作为初始中心点。
Random Partition:随机为每一个observation指定聚类,然后计算每个聚类的中心,以这些中心作为初始中心点。
3,步骤
下图是kmeans算法的聚类过程:叉点表示聚类中心
a.划分: 把xp分配到Si中,图中的紫红色划分线,使得WCSS最小。由于WCSS是欧氏距离的平方,所以直观上讲,就是把xp分配到离它最近的一个Si中。
b.更新聚类中心:
就是对类别Si中的点做算术平均,由于算术平均值是一种最小二乘估计(最小二乘法通过最小化误差的平方和寻找数据和最佳函数的匹配),所以这一步也有助于聚类内部WCSS值的减小。
c.重复以上两步,直到划分方案不再改变。因为a,b两步都在最小化WCSS,且分配方案有限,所以算法最终会收敛到某个最优解,但不一定是全局最优的。
以上步骤是基于EM思想。
以上内容主要依据wiki及wiki reference中的一些参考材料,图片来自《Pattern Recognition and Machine Learning》。
漫谈clustering中也提供了一种数学描述,对理解也有一些帮助。