K-Means++算法
2013-10-15 16:30
141 查看
k-means算法是一种基本的聚类算法,这个算法的先决条件是
1)必须选择最终结果需要聚为几类,就是k的大小。
2)初始化聚类中心点,也就是seeds。
当然,我们可以在输入的数据集中随机的选择k个点作为seeds,但是随机选择初始seeds可能会造成聚类的结果和数据的实际分布相差很大。既然选择初始的seeds这么重要,那有什么算法可以帮助选择初始的seeds吗?当然有,k-means++就是选择初始seeds的一种算法。
k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。wiki上对该算法的描述是如下:
从输入的数据点集合中随机选择一个点作为第一个聚类中心
对于数据集中的每一个点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)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。So it's work!
参考资料:
1)http://coolshell.cn/articles/7779.html
2)http://en.wikipedia.org/wiki/K-means%2B%2B
3)http://stackoverflow.com/questions/5466323/how-exactly-does-k-means-work
1)必须选择最终结果需要聚为几类,就是k的大小。
2)初始化聚类中心点,也就是seeds。
当然,我们可以在输入的数据集中随机的选择k个点作为seeds,但是随机选择初始seeds可能会造成聚类的结果和数据的实际分布相差很大。既然选择初始的seeds这么重要,那有什么算法可以帮助选择初始的seeds吗?当然有,k-means++就是选择初始seeds的一种算法。
k-means++算法选择初始seeds的基本思想就是:初始的聚类中心之间的相互距离要尽可能的远。wiki上对该算法的描述是如下:
从输入的数据点集合中随机选择一个点作为第一个聚类中心
对于数据集中的每一个点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)较大的区间内,所以对应的点会以较大的概率被选中作为新的聚类中心。So it's work!
参考资料:
1)http://coolshell.cn/articles/7779.html
2)http://en.wikipedia.org/wiki/K-means%2B%2B
3)http://stackoverflow.com/questions/5466323/how-exactly-does-k-means-work
相关文章推荐
- 第八周 分段函数求值
- Java利用QRCode.jar包实现二维码编码与解码
- SRAM和DRAM
- 启动遍历文件夹中的所有指定的文件 ( 执行exe文件 或者加载dll )
- Java利用QRCode.jar包实现二维码编码与解码
- 【原】Telerik radwindow 在IE10下偶尔报 unable to get value of the property 'toLowerCase' 的解决办法
- cocos2d-x用create_project.py创建项目报错
- API DLL MFC
- textfield的使用 想不会都难
- 杭电acm2009求数列的和
- OpenCV: OpenCV中GPU模块使用
- iOS开发篇—轻量级数据持久化 DataLite介绍
- 科技的未来(续篇 下)
- Java基础——异常(Exception)概述
- Eclipse快捷键大全(转载)
- SQL语句
- HSQLDB简介
- 微信公众平台开发介绍(一)
- Leetcode: Text Justification
- 第八周上机实践项目1