大家好!我是钱大鑫!本篇博客我主要跟大家探讨一下经典聚类算法——k-means。还是那句话,学习算法不是一件可以瞬间学会的事情,大家慢慢读,慢慢领悟,内容绝大部分为会设计到一些数学知识,算法嘛,正常的!读完记得自己实践一下,好了,废话不多说,我们直接来看k-means算法。
k−means 算法是实践中使用最广泛的聚类算法。该算法具有简单、易懂、良好的可伸缩性等显著优点,而且对其稍加改动就能应用于半监督学习或者流数据处理等多种不同应用场景。长期以来,很多人一直在坚持改进和扩展 k−means 算法,使得该算法充满了活力。
1. 算法基本介绍
首先我们来理解一下什么是 k−means 算法。 k−means 算法是一种直接聚类算法,使用很广泛。给定一个对象(或记录)的集合,所谓聚类(或拆分)就是把这些对象划分为多个组或者“聚簇”,从而使得同组内对象间比较相似而不同组对象间差异比较大。换种说法就是,聚类就是要将相似的对象放入同一聚簇,而将不同的对象分到不同的聚簇中。在这里有一点是值得提一下的,在回归、分类等有监督学习算法中需要定义类别标签或者目标值,但聚类过程的输入对象没有与之关联的目标信息(即没有与之关联的类别标签或者目标值)。因此,我们把聚类算法通常叫做无监督学习算法的一类集合。而恰恰因为无监督学习算法不需要带标签数据,所以适用于许多难于获取带标签数据的应用。而在进行有监督学习任务之前,经常也需要利用聚类等无标签学习方法来探查数据集并且挖掘其特性。另外一点,由于聚类不使用类别标签,所以相似性的概念要基于对象的属性进行定义,也就是说,如何判断数据集中的不同数据属于同一聚簇,得看具体的应用。不同的聚类算法适用的数据集类型和挖掘目的都不一样。
k−means 算法是一种简单的迭代型聚类算法,它将一个给定的数据集分为用户指定的 k 个聚簇。实现和运行该算法都很简单 ,它的运行速度也比较快,同时易于修改,所以在实际中使用非常广泛。它可以说是数据挖掘领域中最为重要的算法之一。
下面,我们就来具体的探讨一下 k−means 算法的细节以及其局限性。当然我所提到的k-means算法内容不一定完全正确,还请同学们多多讨论,多多思考。
2. 算法描述及伪代码
k−means 算法的输入对象是 d 维向量空间中的一些点。因此,他是对一个 d 维向量空间的点集 D={ xi|i=1,...,N} 进行聚类,其中 xi∈Rd 表示第 i 个对象(或称“数据点”)。 k−means 聚类算法会将集合 D 划分为 k 个聚簇。也就是说, k−means 算法对 D 中所有的数据点进行聚类处理。将每个点 xi 都归于且仅对于 k 个聚簇中的一个。我们可以为每一个点分配一个聚簇标识来记录该点将要被分配到哪一个聚簇中去。拥有相同聚簇标识的点属于同一个聚簇,拥有不同聚簇标识的点属于不同的聚簇。我们可以定义一个长度为 N 的聚簇成员变量 m ,其分量 mi 代表点 xi 的聚簇标识。
k 值是基本 k−means 算法的一个关键性的输入。确定 k 值的典型做法是依据某些先验知识,例如集合 D 中实际存在的或当前应用所预期的聚簇数量,当然也可以通过测试不同的 k 值进行探查聚簇的典型信息,从而最终选取合适的 k 值。关于这个 k 值的选取我们一会儿再说。其实, k 值的选取对于理解 k−means 算法如何对数据进行划分没啥关系。
在 k−means 算法中,每个聚簇都用