龙空技术网

聚类算法k-means详细介绍

积极的阳光i 454

前言:

当前小伙伴们对“kmeans聚类算法公式”大约比较珍视,咱们都需要学习一些“kmeans聚类算法公式”的相关资讯。那么小编在网上搜集了一些有关“kmeans聚类算法公式””的相关内容,希望咱们能喜欢,我们一起来学习一下吧!

在数据分析的术语之中,聚类和分类是两种技术。

分类:分类其实是从特定的数据中挖掘模式,作出判断的过程,是指 我们已经知道了事物的类别,需要从样品中学习分类的规则,是一种有指导学习。比如Gmail邮箱里有垃圾邮件分类器,一开始的时候可能什么都不过滤,在日常使用过程中,我人工对于每一封邮件点选“垃圾”或“不是垃圾”,过一段时间,Gmail就体现出一定的智能,能够自动过滤掉一些垃圾邮件了。这是因为在点选的过程中,其实是给每一条邮件打了一个“标签”,这个标签只有两个值,要么是“垃圾”,要么“不是垃圾”,Gmail就会不断研究哪些特点的邮件是垃圾,哪些特点的不是垃圾,形成一些判别的模式,这样当一封信的邮件到来,就可以自动把邮件分到“垃圾”和“不是垃圾”这两个我们人工设定的分类的其中一个。

聚类:聚类的目的也是把数据分类,但是事先我们是不知道如何去分的,完全是算法自己来判断各条数据之间的相似性,相似的就放在一起。在聚类的结论出来之前,我们完全不知道每一类有什么特点,一定要根据聚类的结果通过人的经验来分析,看看聚成的这一类大概有什么特点。

聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术。聚类分析也叫分类分析,或者数值分类。聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化。

聚类和分类的区别:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来。即分类是有监督学习,聚类则是无监督学习。

本文介绍一下 机器学习中的一种经典且实用的聚类算法算法---k-means

k-means 聚类算法

基本概念

K值:指的是希望将数据集分成几个类别,要得到簇的个数,需要指定K值。比如设定K=4,表示将数据集分成4类。

质心:指的是每一个簇(类别)的中心点,即向量各维所取的平均值。比如数据集是2维数据,x轴上的所有点取均值x0,y轴上的所有点取均值y0,那么质心可以表示为(x0,y0)。

距离的度量:常用欧式距离和余弦相似度(需要先标准化)

数据标准化 指的是数据需要在同一个纬度下衡量,标准化方法最常用的有两种:

min-max标准化(离差标准化):对原始数据进行线性变换,是结果落到【0,1】区间,转换方法为 X'=(X-min)/(max-min),其中max为样本数据最大值,min为样本数据最小值。

z-score标准化(标准差标准化):处理后的数据符合标准正态分布(均值为0,方差为1),转换公式:X减去均值,再除以标准差

优化目标:这个跟我们机器学习的套路是一样的,需要找到一个整体误差最小的平衡点使得整体分类的欧式距离(损失值) 最小,一个簇的距离指这个簇的所有数据到该簇的质心的欧式距离求和;整体距离是指,K个簇的距离求和。

我们的目标就是使得整体距离最小,目标函数可用如下公式表示,

工作流程

k-means算法的工作流程可参考下图,

说明:

1)假设初始情况下有一堆点,如图a所示,初始状态下,由于是无监督的学习,数据没有标签,不知道分成几类;

2)用k-means算法,需要指定k值,设定k=2(分成2类),k-means算法会自动随机初始化2个质心点(蓝色和红色的差号);

3)现在需要将数据集中的其余的点自动分类到红色的x或者蓝色的x,分类的方法就是 遍历数据集中的每个点,分别求取这个点到红x和蓝x的(欧式)距离,离那个质心点近就归为哪一类,第一轮遍历结束后,分成了2类(红色和蓝色标识),如图c所示;

4)很明显可以看到,第一轮的分类效果并不理想, 这时还需要更新质心,第一轮质心的随机选择的。新一轮的迭代需要更新质心,更新方法:上一轮我们已经初步将点集分为了2(k=2)类,分别对所有的红色点集和蓝色点集 计算质心,计算方法就是在所属纬度求取平均值,比如 分别在x轴和y轴两个纬度取红色点集和蓝色点集的均值作为第2轮的质心,如图d 新的红色x和蓝色x;

5)更新质心后,用新的质心 重新遍历样本中的所有点,对样本中的点重新分类,操作方法与第3步一致,分类完成后,效果如图e所示

6)第2轮更新后,从效果上看分类操作已经完成,再次更新质心(重复第4步),再次遍历所有的样本点,重新分类,依次循环,直到分类结果不会再发生变化

这里的示例k=2,k=3, 表示分成3类,原理是一样的。

优缺点

优点:

原理简单速度快对大数据集有比较好的伸缩性,适合常规的数据集

缺点:

需要指定聚类数量K,而这个K值 通常比较难确定复杂度与样本呈线性关系对异常值敏感对初始值敏感很难发现任意形状的簇K-Means的细节问题

1)K值怎么定?如何确定应该分几类?

这个真的没有确定的做法,分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的等。或者可以把各种K值算出的整体损失值做比较,取最小的整体损失值的K值。

2)初始的K个质心怎么选?

最常用的方法是随机选,初始质心地选取对最终聚类结果有影响,因此算法一定要多执行几次,哪个结果更reasonable,就用哪个结果。 当然也有一些优化的方法,第一种是选择彼此距离最远的点,具体来说就是先选第一个点,然后选离第一个点最远的当第二个点,然后选第三个点,第三个点到第一、第二两点的距离之和最小,以此类推。第二种是先根据其他聚类算法(如层次聚类)得到聚类结果,从结果中每个分类选一个点。

3)K-Means会不会陷入一直选质心的过程,永远停不下来?

答案是不会,有数学证明K-Means一定会收敛,大致思路是利用SSE的概念(也就是误差平方和),即每个点到自身所归属质心的距离的平方和,这个平方和是一个函数,然后能够证明这个函数是可以最终收敛的函数。

3)判断每个点归属哪个质心的距离怎么算?

看一个例子(也许不太恰当):歌手大赛,三个评委给三个歌手打分,第一个评委的打分(10,8,9) 第二个评委的打分(4,3,2),第三个评委的打分(8,9,10) 如果采用余弦相似度来看每个评委的差异,虽然每个评委对同一个选手的评分不一样,但第一、第二两个评委对这四位歌手实力的排序是一样的,只是第二个评委对满分有更高的评判标准,说明第一、第二个评委对音乐的品味上是一致的。 因此,用余弦相似度来看,第一、第二个评委为一类人,第三个评委为另外一类。 如果采用欧氏距离, 第一和第三个评委的欧氏距离更近,就分成一类人了,但其实不太合理,因为他们对于四位选手的排名都是完全颠倒的。 总之,如果注重数值本身的差异,就应该用欧氏距离,如果注重的是上例中的这种的差异(我概括不出来到底是一种什么差异……),就要用余弦相似度来计算。 还有其他的一些计算距离的方法,但是都是欧氏距离和余弦相似度的衍生,简单罗列如下:明可夫斯基距离、切比雪夫距离、曼哈顿距离、马哈拉诺比斯距离、调整后的余弦相似度、Jaccard相似系数等。

4)单位要一致(数据需要标准化)

比如X的单位是米,Y也是米,那么距离算出来的单位还是米,是有意义的 但是如果X是米,Y是吨,用距离公式计算就会出现“米的平方”加上“吨的平方”再开平方,最后算出的东西没有数学意义,这就有问题了。 还有,即使X和Y单位一致,但是如果数据中X整体都比较小,比如都是1到10之间的数,Y很大,比如都是1000以上的数,那么,在计算距离的时候Y起到的作用就比X大很多,X对于距离的影响几乎可以忽略,这也有问题。 因此,如果K-Means聚类中选择欧几里德距离计算距离,数据集又出现了上面所述的情况,就一定要进行数据的标准化(normalization),即将数据按比例缩放,使之落入一个小的特定区间。去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行计算和比较。 标准化方法参考前面的介绍。

5)每一轮迭代如何选出新的质心

各个维度的算术平均,比如(X1,Y1,Z1)、(X2,Y2,Z2)、(X3,Y3,Z3),那就新质心就是【(X1+X2+X3)/3,(Y1+Y2+Y3)/3,(Z1,Z2,Z3)/3】,这里要注意,新质心不一定是实际的一个数据点。

6)关于离群值

离群值就是远离整体的,非常异常、非常特殊的数据点,在聚类之前应该将这些“极大”“极小”之类的离群数据都去掉,否则会对于聚类的结果有影响。但是,离群值往往自身就很有分析的价值,可以把离群值单独作为一类来分析。

最后介绍一下 一个很好玩的k-means 效果动态演示的网站(站外链接地址不能直接发,参考图上的网址),很有意思。有兴趣的可以玩一下,参考图片中的网址。

总结:

本文对聚类的概念,k-means 算法中的K值,质心,距离和目标函数,工作原理和流程,优缺点,细节问题和动态演示等内容做了比较详细的介绍,通过本文的介绍,对机器学习中的k-means算法应该有了一定的了解,如有疑问,欢迎留言讨论。感谢阅读~

标签: #kmeans聚类算法公式 #matlab实现kmeans聚类算法 #kmeans算法思路 #kmeans聚类算法公式介绍 #聚类分析kmeans算法一次迭代运行时间