(一)聚类-无监督学习
事先并不知道任何样本的类别标号,希望通过某种算法来把一组未知类别的样本划分成若干类别,聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到一起,这在机器学习中被称作unsupervised learning(无监督学习)
K-means是寻找给定数据集的K个簇的聚类算法,也称之为K-均值,是因为它可以发现(寻找)K个不同的簇,且每个簇的中心采用簇中所含数据的均值计算而成。其中簇的个数是用户指定的,每一个簇通过其质心,即簇中所有的中心来描述。
优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 使用数据类型:数值型数据
(二)分类-有监督学习
根据一些给定的已知类别标号的样本,训练某种模型(得到某种目标函数),使它能够对未知类别的样本进行分类。这属于supervised learning (监督学习)。
聚类与分类算法最大的区别在于,分类的目标类别已知,而聚类的目标类别是未知的。
(1)K-means场景
主要用于聚类,但是类别是未知的
(2)K-means术语
簇:所有数据点集合,簇中的对象是相似的 质心:簇中所有点的中心(计算所有点的均值而来) SSE:Sum of Sqared Error(平方误差和),SSE值越小,表示越接近他们的质心,由于误差取了平方,更加注重那些远离质心的点 K:初始中心点的个数(用户自己定义的聚类中心个数) Means:求中心点到其他数据点距离的平均值
(三)K-means算法原理
通过上面的介绍,我们知道K-means聚类算法是无监督的分类算法,也就是给定一堆数据,没有任何的标签,也就是不知道这些数据有什么共性或者不同,我们都不知道。针对这样的情况,我们只指定对这些数据所分的类别数,也就是K-means 聚类算法中的 K 我们指定固定的值,然后对数据集进行聚类,因为聚类算法大多数处理的都是数值型的数据,所以我们对指定的K个数值,都能在数据集中找到他对应的位置,接下来就是让若干的数据求数据点本身到K个点(K个质心)的距离(我们指定的K个数据点称为质心)。由此计算可得到若干的数据点距离哪个质心距离最近,距离最近的就归为一簇,也可被称为一类。为了直观形象的表达聚类算法的核心,接下来我会图文并茂的形式来介绍K-means 聚类算法。
假如我们选择 K 等于3,针对下面的这些点,我们选择的聚类中心点(质心)如下: 对于周围的数据点而言,这样的三个聚类中点(质心)显然不能把周围点全部完美的分开,也就是不能把数据合理的分为三类,所以我们对聚类中心点做了调整,如下图所示: 如果选择这三个点作为聚类的中心点,就可以把所有数据合理的分为三类,到这的话,直接说分为三类对于K-means 聚类算法而言有点早。 思考:对于上图中箭头所指的点,我们把它分给那个点更合适呢? 解答:通过下图我们可以直观的看见箭头所指的数据点距离三个聚类中心点的距离长度,所以选择距离最近的中心的点作为一簇。 对于其他数据点来说,聚类的原理和方法同理,如下图所示: 到这里可能很多小伙伴觉得聚类算法已经结束了,其实这只是个开始,请看下面的例子。
(四)K-means 聚类算法详解
1 假如我们有这样的一堆数据,在空间的坐标系中,我们随便选择三个点作为聚类的中心点(这里也可以说“质心”),如下图所示: 2 针对这样的三个质心,我们对数据点进行聚类(在次重申:不包括质心所有的数据点分别求它们各自到三个质心的距离,距离最近的那个质心它们就归为一类),得到如下结果: 3 这样的结果就是最终的结果吗?好像不是吧,如果是我聚类,我一定会选择把三个分支内的数据各自分为一类,而不是每个分支内包括不同的类别。那该怎么解决呢?我们很容易就可以发现,如果我们把质心选择在不同的分支内部,就可以解决了呢。聚类算法恰恰也想到了这点,当我们第一次聚类成功,他会迭代更新,对已经聚好的类中的数据点求平均值,进而得到新的聚类中心(质心),如下图所示:(不断迭代,更新质心) 4 如上图所示,通过更新质心的位置,我们得到了三个新坐标位置的质心,我们可以发现如上图的聚类结果而言,仍然不是我们想要的,那么我们围绕这三个新的质心,在进行一次聚类,通俗的说就是在求一次这些数据点到三个质心的距离,然后选择距离最近的那个质心点作为一类(相同的一簇),结果如下所示: 5 此刻,我们可以看见,三个分支内的数据点基本已经完全分成了三个独立的簇,但是还存在个别的数据点没有成功分类,我们可以继续求新的簇内的质心,得到的结果如下图所示: 6 通过上图我们可以发现,这次迭代之后,质心完全在三个独立的分支内,得到了新的质心,我们同样在对若干的数据点求他们到不同质心的距离,进而在进行聚类,会得到如下图所示的结果: 7 从上图的聚类结果来看,就是我们理想中的聚类结果。但是算法是迭代更新的,如果我们继续迭代会得到什么样的结果呢? 8 此时,我们就会发现如果我们继续迭代更新下去,质心不会移动,分类的结果也不再会改变,到这里聚类算法就结束了。
(五)总结
K-means 聚类算法流程:
- 选择聚类的个数 K(质心)
- 生成K个聚类中心点
- 计算所有样本点到聚类中心点的距离
- 选择距离最近的点作为一簇
- 更新质心,迭代聚类
- 根据得到的新的质心,继续计算所有样本点到聚类中心点的距离,选择选择距离最近的点作为一簇,
- 更新质心,迭代聚类(重复第6步)
- 直到满足收敛条件
|