K-means++ 聚类
2015-11-03 22:22
197 查看
[本文链接:http://blog.csdn.net/shanglianlm/article/details/45919679,转载请注明出处]
初始聚类中心要人为或者随机选择,不同的选取对最后的聚类结果影响很大。
从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心
对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
重复2和3直到k个聚类中心被选出来
利用这k个初始的聚类中心来运行标准的k-means算法
算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:
先从我们的数据库随机挑个随机点当“种子点”
对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
重复2和3直到k个聚类中心被选出来
利用这k个初始的聚类中心来运行标准的k-means算法
可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因比较简单,如下图 所示:
假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。
参考及延伸材料:
[1] wikipedia
K-means算法的主要缺陷:
聚类的个数K 需要预先给定。初始聚类中心要人为或者随机选择,不同的选取对最后的聚类结果影响很大。
k-means++算法基本思想
Kmeans++主要针对上面的第二个缺陷进行处理。k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。 以下为基本思路:从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心
对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
重复2和3直到k个聚类中心被选出来
利用这k个初始的聚类中心来运行标准的k-means算法
算法的关键是第3步,如何将D(x)反映到点被选择的概率上,一种算法如下:
先从我们的数据库随机挑个随机点当“种子点”
对于每个点,我们都计算其和最近的一个“种子点”的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。
然后,再取一个随机值,用权重的方式来取计算下一个“种子点”。这个算法的实现是,先取一个能落在Sum(D(x))中的随机值Random,然后用Random -= D(x),直到其<=0,此时的点就是下一个“种子点”。
重复2和3直到k个聚类中心被选出来
利用这k个初始的聚类中心来运行标准的k-means算法
可以看到算法的第三步选取新中心的方法,这样就能保证距离D(x)较大的点,会被选出来作为聚类中心了。至于为什么原因比较简单,如下图 所示:
假设A、B、C、D的D(x)如上图所示,当算法取值Sum(D(x))*random时,该值会以较大的概率落入D(x)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。
k-means++ 的 MATLAB 代码实现
function [L,C] = kmeanspp(X,k) %KMEANS Cluster multivariate data using the k-means++ algorithm. % [L,C] = kmeans_pp(X,k) produces a 1-by-size(X,2) vector L with one class % label per column in X and a size(X,1)-by-k matrix C containing the % centers corresponding to each class. % Version: 2013-02-08 % Authors: Laurent Sorber (Laurent.Sorber@cs.kuleuven.be) L = []; L1 = 0; while length(unique(L)) ~= k % The k-means++ initialization. C = X(:,1+round(rand*(size(X,2)-1))); %size(X,2)是数据集合X的数据点的数目,C是中心点的集合 L = ones(1,size(X,2)); for i = 2:k D = X-C(:,L); %-1 D = cumsum(sqrt(dot(D,D,1))); %将每个数据点与中心点的距离,依次累加 if D(end) == 0, C(:,i:k) = X(:,ones(1,k-i+1)); return; end C(:,i) = X(:,find(rand < D/D(end),1)); %find的第二个参数表示返回的索引的数目 [~,L] = max(bsxfun(@minus,2*real(C'*X),dot(C,C,1).')); %将每个数据点进行分类。 end % The k-means algorithm. while any(L ~= L1) L1 = L; for i = 1:k, l = L==i; C(:,i) = sum(X(:,l),2)/sum(l); end [~,L] = max(bsxfun(@minus,2*real(C'*X),dot(C,C,1).'),[],1); end end
参考及延伸材料:
[1] wikipedia
相关文章推荐
- scrapy中Selectors的用法
- Servlet请求重定向&中文插入数据库
- [NOIP 2011]计算系数 乘法逆元+扩展欧几里得
- Eclipse更改console口文字颜色
- 打印9*9 乘法表
- Chapter 7 Exercises & Problems
- 二,游戏的game loop搭建
- 开发工具文件格式简析(.suo、.user、.obj、……)(一)(待续)
- Android 直接转拨分机号码
- HTML-列表标签
- C#Enum类型向sqlserver插入问题
- loadrunner安装破解中遇到的问题和解决方法
- IOS 弹出模态View presentViewController
- Chapter 6 Exercises & Problems
- 在Sharepoint中批量删除大量条目
- 中文 gbk gb2312 在线转换 编码码 对照表 自动转换 在线转换(推荐)
- haproxy实现反向代理和负载均衡
- imagick图像处理插件安装
- <仅是自己做笔记。。。系列-5>给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数。
- Ceph Newstore存储引擎介绍