K-均值聚类算法,对无标签数据进行分组汇聚

本文已收录于 机器学习笔记 系列,共计 20 篇,本篇是第 11 篇

聚类可以解决实际中的什么问题?

聚类是一种无监督学习方法,所谓无监督学习就是数据没有标签

物以类聚人以群分,聚类顾名思义就是将一些属性相似的东西归结在一起。

现实中,例如银行对客户群,哪些客户是可以盈利的,而哪些客户是不仅不挣钱还要赔钱的。我们可以将他们划分出来,以便后续的营销使用。这就是客户群划分所能利用的聚类。

社交软件例如微信好友之间的联系,联系较多的人我们可以将他们聚集在一起,认为关系比较好。

异常数据存在异常特征,发现孤立点可以排查是否发生信用卡诈骗、黑客攻击等。

 

 

聚类都有哪些算法?

聚类算法有很多种,例如原型聚类、密度聚类、层次聚类等。

在西瓜书中讲解的聚类算法较多,有需要的同学可以研读西瓜书中的第九章聚类算法。

在《统计学习方法》书中主要讲解了层次聚类。

在《机器学习实战》这本书中,聚类算法只讲解了一个K均值算法(K-means)。

但实际上聚类算法有非常多:

嘿,来聚个类

 

聚类算法

举个例子:

现在有四个对象A、B、C和D,拥有特征1和特征2。(请注意,这里和有标签的有监督学习不同,y并不是标签而是一个特征)

取初始重心点

计算样本点到质心的距离

更新样本的簇

根据A、B、C、D四个点到C1、C2的距离远近,距离C1近的划分到C1类,距离C2近的划分到C2类

现在,A划分到group-1、B、C、D划分到group-2。

重新计算重心

因为A点就是在C1上的,所以重心没有变化。

B、C、D三个点距离C2都是有距离的,需要计算C2的点位(三个点的重心)。计算的方法是算数平均数。

得到新的C2坐标:

继续计算,不断的更迭C1、C2坐标:

继续更迭C1、C2坐标:

终止条件

直到C1、C2重心点坐标不发生变化,终止循环。

 

python实现k-means

python实现K-MEANS

数据源下载:data kmeans

jupyter源文件:python实现K-MEANS

 

问题一:局部最小值,初始点的选取也会影响聚类效果

下图的初始点选取较差:

而这张图的初始点选取效果较好:

来源:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/

不同初始点对最终聚类的效果有很大的影响,而初始点的选取又是随机的,那么该如何解决这个局部最优问题?

解决方法:多次尝试

进行多次随机初始化,计算代价函数,选择代价函数最小的一次作为最终聚类结果(是选择最好的一次结果,已经进行了多次重复聚类,而不是一开始就“预测”哪种方式初始化能得到最好的效果)。

python实现K-MEANS_优化1_代价函数应用

数据集:kmeans

jupyter文件:python实现K-MEANS_优化1_代价函数应用

 

问题二:K值如何选择?聚成几类更合适?

K值是由用户所指定的,观察下图K值分别指定为3和5得到的两张聚类结果:

左边蓝色太稀疏了,明显再切分以下更合适。而右边的右上角蓝色和红色那么近,划分为一类更好。

那么问题来了?K值如何选取?得到一个最好的聚类效果。换句话说聚成几类更合适?

解决方法:肘部肘部法

上面问题一中通过多次尝试初始化k-means函数得到很多代价函数loss值,值的变化是越来越小的:

将每次loss值存起来画一个折线图,图中当K=3时会出现一个肘部,这是理想的聚类个数。

胳膊肘关节又黑又粗糙,怎么变回白嫩肌肤?|皮肤|关节|黑色素沉着_新浪新闻

 

python实现K-MEANS_优化2_肘部法

数据集:kmeans

jupyter文件:python实现K-MEANS_优化2_肘部法

 

问题三:K均值的局限性:非圆形数据

使用上述的K-means算法会聚类成下面的样子:

而实际应该下图才对:

聚类不理想的一种情况:

来源:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/

因为K-means是按照距离聚类的,所以这种类型的数据就不太适用。

这种情况可以使用密度聚类法。——例如 DBSCAN 算法。

解决方法:基于密度聚类

具体算法介绍会开一篇新的文章。

 

问题四:数据比较大的时候,收敛会很慢

解决方法:使用 Mini-Batch

具体算法介绍会开一篇新的文章。

 
参考文献:
https://www.youtube.com/watch?v=Tf_iP0r8Cns&list=PLzw77domqr9s5upGq1vaCZK2dO1_0ir0p&index=60

作者: 高志远

高志远,24岁,男生

发表评论

邮箱地址不会被公开。