KMeans笔记
2015-10-08 19:10
288 查看
1.算法描述
K-Means算法的输入对象是d维空间中的一些点。因此,它是对一个d维向量的点集进行聚类,其中
表示第i个对象(或称数据点)。K-Means聚类算法将集合D划分成k个聚簇。也就是说,K-Means算法对D中所有的数据点进行聚类处理,将每个点
都归于k个聚簇中的一个。我们可以为每一个点分配一个聚簇标识以记录该点分配到哪一个聚簇中去了,拥有相同聚簇标识的点属于同一聚簇,反之,属于不同聚簇。我们可以定义一个长度为N的聚簇成员向量m,其分量
表示点
的聚簇标识。
这里的k值是K-Means算法的一个关键的输入,确定k值的典型做法是依据某些先验知识。但是,如何选取k值对理解K-Means算法如何对数据集D进行划分没有关系。在K-Means算法中,每个聚簇都用
中的一个点来代表。可将这些聚簇用集合
来表示。这k个聚簇代表有时也被称为聚簇均值或聚簇中心。
聚类算法通常基于“紧密度”或者“相似度”等概念对点集进行分组。具体到K-Means算法,默认的紧密度度量标准是欧几里得距离。K-Means算法实质是要最小化一个如下的非负代价函数:
换言之,K-Means算法要最小化的目标是:每个点
和离它最近的聚簇中心
之间的欧几里得距离。而代价函数通常也被称为K-Means目标函数。
下面用一个例子演示K-Means算法过程:
第一步,在所有数据点还没进行聚类之前,随机初始化3个数据点作为聚簇中心,其他数据点默认都标记为红色,如下图:
第二步,进行一次迭代。对数据点进行聚类,同时重新计算聚簇中心,如下图:
经过一次迭代后,发现聚簇中心并未收敛,或者说聚类结果不够好,然后在进行聚类,重新计算聚簇中心,如下图:
此时,可以认为聚簇中心收敛,聚类结果很好了。
2.其他计算距离
上一节提到了K-Means算法默认使用的是欧氏距离,当然也可以根据实际情况使用其他距离,如:闵可夫斯基距离:
,(
可以随意取值,可以是正数,可以是负数,也可以是无穷大)
欧氏距离:
,(闵可夫斯基距离
的特例)
CityBlock距离:
,(闵可夫斯基距离
的特例)
3.算法局限
K-Means算法本质上是一种面向非凸代价函数优化的贪婪下降求解算法,所以仅能求得局部最优解。此外,该算法还对初始化聚簇中心的位置非常敏感,即便是同一数据集,如果聚簇中心集合C的初始化不同,最终获得的聚簇可能会差异很大。下面用类似第一节的例子来说明,首先随机选取如下图的聚簇中心:
最终的收敛结果会像下图一样:
4.伪代码
K-Means算法:创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
参考文献:
《数据挖掘十大算法》
http://www.cnblogs.com/moondark/archive/2012/03/08/2385770.html
相关文章推荐
- 聚类算法之kmeans算法java版本
- 用Python从零实现贝叶斯分类器的机器学习的教程
- python中kmeans聚类实现代码
- My Machine Learning
- 机器学习---学习首页 3ff0
- 也谈 机器学习到底有没有用 ?
- 量子计算机编程原理简介 和 机器学习
- 初识机器学习算法有哪些?
- 10个关于人工智能和机器学习的有趣开源项目
- 机器学习实践中应避免的7种常见错误
- 机器学习书单
- 北美常用的机器学习/自然语言处理/语音处理经典书籍
- 如何提升COBOL系统代码分析效率
- kmeans python版
- 数据挖掘-聚类-K-means算法Java实现
- 支持向量机(SVM)算法概述
- 神经网络初步学习手记
- 常用的分类评估--基于R语言
- 开始spark之旅
- spark的几点备忘