聚类 和 k-means简单概括。
- 聚类是一种 无监督学习 问题,它的目标就是基于 相似度 将相似的子集聚合在一起。
k-means
算法是聚类分析中使用最广泛的算法之一。它把n
个对象根据它们的属性分为k
个聚类,以便使得所获得的聚类满足:
同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。
k - means的算法原理:
(文/qinm08(简书作者) 原文链接:http://www.jianshu.com/p/32e895a940a2)
使用K-Means算法进行聚类,过程非常直观:
(a) 给定集合D,有n个样本点
(b) 随机指定两个点,作为两个子集的质心
(c) 根据样本点与两个质心的距离远近,将每个样本点划归最近质心所在的子集
(d) 对两个子集重新计算质心
(e) 根据新的质心,重复操作(c)
(f) 重复操作(d)和(e),直至结果足够收敛或者不再变化
Python demo:
from sklearn.cluster import KMeans model=KMeans(n_clusters=4,random_state=0) X=[ [50.0,50.0,9.0] ,[28.0, 9.0,4.0] ,[17.0,15.0,3.0] ,[25.0,40.0,5.0] ,[28.0,40.0,2.0] ,[50.0,50.0,1.0] ,[50.0,40.0,9.0] ,[50.0,40.0,9.0] ,[40.0,40.0,5.0] ,[50.0,50.0,9.0] ,[50.0,50.0,5.0] ,[50.0,50.0,9.0] ,[40.0,40.0,9.0] ,[40.0,32.0,17.0] ,[50.0,50.0,9.0] ] model.fit(X) for a in X: print(model.predict(a),a)
结果:
(array([1]), [50.0, 50.0, 9.0]) (array([2]), [28.0, 9.0, 4.0]) (array([2]), [17.0, 15.0, 3.0]) (array([3]), [25.0, 40.0, 5.0]) (array([3]), [28.0, 40.0, 2.0]) (array([1]), [50.0, 50.0, 1.0]) (array([0]), [50.0, 40.0, 9.0]) (array([0]), [50.0, 40.0, 9.0]) (array([0]), [40.0, 40.0, 5.0]) (array([1]), [50.0, 50.0, 9.0]) (array([1]), [50.0, 50.0, 5.0]) (array([1]), [50.0, 50.0, 9.0]) (array([0]), [40.0, 40.0, 9.0]) (array([0]), [40.0, 32.0, 17.0]) (array([1]), [50.0, 50.0, 9.0])
两个缺点:
1)初始聚类中心的个数需要事先给定,一般非常困难
2)初始聚类中心的选取很随机,可能导致非常不同的聚类效果
K-means++算法:
改进了2)初始聚类中心的选取
(a)从数据集中随机选择一个点,作为第一个中心C1
(b)计算所有点到离它最近的中心的距离D(x),然后在此中心根据概率原则选择距离“比较大”的点作为下一个中心点。
SUM(D(x))*random(0,1)>SUM(D(xi) && SUM(D(x))*random(0,1)<SUM(D(xi-1)
(c)重复操作(b)直到找到k个中心点
缺点:
k个中心点,互相依赖,即内在的有序性。
每天进步一点点