KMeans笔记

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个数据点作为聚簇中心,其他数据点默认都标记为红色,如下图:

KMeans笔记_第1张图片

第二步,进行一次迭代。对数据点进行聚类,同时重新计算聚簇中心,如下图:

KMeans笔记_第2张图片

经过一次迭代后,发现聚簇中心并未收敛,或者说聚类结果不够好,然后在进行聚类,重新计算聚簇中心,如下图:

KMeans笔记_第3张图片

此时,可以认为聚簇中心收敛,聚类结果很好了。

2.其他计算距离

上一节提到了K-Means算法默认使用的是欧氏距离,当然也可以根据实际情况使用其他距离,如:
闵可夫斯基距离:
,( 可以随意取值,可以是正数,可以是负数,也可以是无穷大)
欧氏距离:
,(闵可夫斯基距离 的特例)
CityBlock距离:
,(闵可夫斯基距离 的特例)

KMeans笔记_第4张图片

3.算法局限

K-Means算法本质上是一种面向非凸代价函数优化的贪婪下降求解算法,所以仅能求得局部最优解。此外,该算法还对初始化聚簇中心的位置非常敏感,即便是同一数据集,如果聚簇中心集合C的初始化不同,最终获得的聚簇可能会差异很大。
下面用类似第一节的例子来说明,首先随机选取如下图的聚簇中心:
KMeans笔记_第5张图片

最终的收敛结果会像下图一样:

KMeans笔记_第6张图片

4.伪代码

K-Means算法:
创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时

对数据集中的每个数据点

对每个质心

计算质心与数据点之间的距离

将数据点分配到距其最近的簇

对每一个簇,计算簇中所有点的均值并将均值作为质心



参考文献:

《数据挖掘十大算法》

http://www.cnblogs.com/moondark/archive/2012/03/08/2385770.html

你可能感兴趣的:(机器学习,kmeans,learning,machine)