文章目录

  • 1.什么是聚类
  • 2.K-Means步骤
  • 3.K-Means的数学描述
  • 4.初始中心点怎么确定
  • 5.K值怎么确定
  • 6.小结

1.什么是聚类

先来回顾一下本系列第一篇就讲到的机器学习的种类。

监督式学习:训练集有明确答案,监督学习就是寻找问题(又称输入、特征、自变量)与答案(又称输出、目标、因变量)之间关系的学习方式。监督学习模型有两类,分类和回归。

• 分类模型:目标变量是离散的分类型变量;
• 回归模型:目标变量是连续性数值型变量。

无监督学习:只有数据,无明确答案,即训练集没有标注目标变量。常见的无监督学习算法有聚类(clustering),由计算机自己找出规律,把有相似属性的样本放在一组,每个小组也称为簇(cluster)。

最早的聚类分析是在考古分类、昆虫分类研究中发展起来的,目的是找到隐藏于数据中客观存在的“自然小类”,“自然小类”具有类内结构相似、类间结构差异显著的特点,通过刻画“自然小类”可以发现数据中的规律、揭示数据的内在结构

之前一起学了回归算法中超级典型的线性回归,分类算法中非常难懂的SVM,这两都是有监督学习中的模型,那今天就来看看无监督学习中最最基础的聚类算法——K-Means Cluster吧。

2.K-Means步骤

K-Means聚类步骤是一个循环迭代的算法,非常简单易懂:

  1. 假定我们要对N个样本观测做聚类,要求聚为K类,首先选择K个点作为初始中心点
  2. 接下来,按照距离初始中心点最小的原则,把所有观测分到各中心点所在的类中;
  3. 每类中有若干个观测,计算K个类中所有样本点的均值,作为第二次迭代的K个中心点;
  4. 然后根据这个中心重复第2、3步,直到收敛(中心点不再改变或达到指定的迭代次数),聚类过程结束。

以二维平面中的点Xi=(xi1,xi2),i=1,...,nX_{i}=(x_{i1},x_{i2}),i=1,...,nXi​=(xi1​,xi2​),i=1,...,n为例,用图片展示K=2时的迭代过程:

  1. 现在我们要将(a)图中的n个绿色点聚为2类,先随机选择蓝叉和红叉分别作为初始中心点;
  2. 分别计算所有点到初始蓝叉和初始红叉的距离,Xi=(xi1,xi2)X_{i}=(x_{i1},x_{i2})Xi​=(xi1​,xi2​)距离蓝叉更近就涂为蓝色,距离红叉更近就涂为红色,遍历所有点,直到全部都染色完成,如图(b);
  3. 现在我们不管初始蓝叉和初始红叉了,对于已染色的红色点计算其红色中心,蓝色点亦然,得到第二次迭代的中心,如图(c );
  4. 重复第2、3步,直到收敛,聚类过程结束。

怎么样,很简单吧?看完K-Means算法步骤的文字描述,我们可能会有以下疑问:

  1. 第一步中的初始中心点怎么确定?随便选吗?不同的初始点得到的最终聚类结果也不同吗?
  2. 第二步中点之间的距离用什么来定义?
  3. 第三步中的所有点的均值(新的中心点)怎么算?
  4. K怎么选择

3.K-Means的数学描述

我们先解答第2个和第3个问题,其他两个问题放到后面小节中再说。

聚类是把相似的物体聚在一起,这个相似度(或称距离)是用什么来度量的呢?这又得提到我们的老朋友——欧氏距离

给定两个样本X=(x1,x2,...,xn)X=(x_{1},x_{2},...,x_{n})X=(x1​,x2​,...,xn​)与Y=(y1,y2,...,yn)Y=(y_{1},y_{2},...,y_{n})Y=(y1​,y2​,...,yn​),其中n表示特征数 ,X和Y两个向量间的欧氏距离(Euclidean Distance)表示为:
disted(X,Y)=∣∣X−Y∣∣2=(x1−y1)2+...+(xn−yn)22dist_{ed}(X,Y)=||X-Y||_{2}=\sqrt[2]{(x_{1}-y_{1})^{2}+...+(x_{n}-y_{n})^{2}}disted​(X,Y)=∣∣X−Y∣∣2​=2(x1​−y1​)2+...+(xn​−yn​)2​

k-means算法是把数据给分成不同的簇,目标是同一个簇中的差异小,不同簇之间的差异大,这个目标怎么用数学语言描述呢?我们一般用误差平方和作为目标函数(想想线性回归中说过的残差平方和、损失函数,是不是很相似),公式如下:

SSE=∑i=1K∑x∈Ci(Ci−x)2SSE=\sum_{i=1}^{K} \sum_{x \in C_{i}}\left(C_{i}-x\right)^{2}SSE=i=1∑K​x∈Ci​∑​(Ci​−x)2

其中C表示聚类中心,如果x属于Ci这个簇,则计算两者的欧式距离,将所有样本点到其中心点距离算出来,并加总,就是k-means的目标函数。实现同一个簇中的样本差异小,就是最小化SSE。

我们知道,可以通过求导来求函数的极值,我们对SSE求偏导看看能得到什么结果:
∂∂CkSSE=∂∂Ck∑i=1K∑x∈Ci(Ci−x)2=∑i=1K∑x∈Ci∂∂Ck(Ci−x)2=∑x∈Ci2(Ci−x)=0\begin{aligned} \frac{\partial}{\partial C_{k}} S S E &=\frac{\partial}{\partial C_{k}} \sum_{i=1}^{K} \sum_{x \in C_{i}}\left(C_{i}-x\right)^{2} \\ &=\sum_{i=1}^{K} \sum_{x \in C_{i}} \frac{\partial}{\partial C_{k}}\left(C_{i}-x\right)^{2} \\ &=\sum_{x \in C_{i}} 2\left(C_{i}-x\right)=0 \end{aligned}∂Ck​∂​SSE​=∂Ck​∂​i=1∑K​x∈Ci​∑​(Ci​−x)2=i=1∑K​x∈Ci​∑​∂Ck​∂​(Ci​−x)2=x∈Ci​∑​2(Ci​−x)=0​

∑x∈Ci2(Ci−x)=0⇒miCi=∑x∈Cix⇒Ci=1mi∑x∈Cix\sum_{x \in C_{i}} 2\left(C_{i}-x\right)=0 \Rightarrow m_{i} C_{i}=\sum_{x \in C_{i}} x \Rightarrow C_{i}=\frac{1}{m_{i}} \sum_{x \in C_{i}} xx∈Ci​∑​2(Ci​−x)=0⇒mi​Ci​=x∈Ci​∑​x⇒Ci​=mi​1​x∈Ci​∑​x

式中m是簇中点的数量,发现了没有,这个C的解,就是X的均值点。多点的均值点应该很好理解吧,给定一组点X1,...,XmX_{1},...,X_{m}X1​,...,Xm​,其中Xi=(xi1,xi2,...,xin)X_{i}=(x_{i1},x_{i2},...,x_{in})Xi​=(xi1​,xi2​,...,xin​),这组点的均值向量表示为:
C=(x11+...+x1nm,...,xm1+...+xmnm)C=(\frac{x_{11}+...+x_{1n}}{m},...,\frac{x_{m1}+...+x_{mn}}{m})C=(mx11​+...+x1n​​,...,mxm1​+...+xmn​​)

4.初始中心点怎么确定

在k-means算法步骤中,有两个地方降低了SSE:

  1. 把样本点分到最近邻的簇中,这样会降低SSE的值;
  2. 重新优化聚类中心点,进一步的减小了SSE。

这样的重复迭代、不断优化,会找到局部最优解(局部最小的SSE),如果想要找到全局最优解需要找到合理的初始聚类中心。

那合理的初始中心怎么选?

方法有很多,譬如先随便选个点作为第1个初始中心C1,接下来计算所有样本点与C1的距离,距离最大的被选为下一个中心C2,直到选完K个中心。这个算法叫做K-Means++,可以理解为 K-Means的改进版,它可以能有效地解决初始中心的选取问题,但无法解决离群点问题

我自己也想了一个方法,先找所有样本点的均值点,计算每个点与均值点的距离,选取最远的K个点作为K个初始中心。当然,如果样本中有离群点,这个方法也不佳。

总的来说,最好解决办法还是多尝试几次,即多设置几个不同的初始点,从中选最优,也就是具有最小SSE值的那组作为最终聚类。

5.K值怎么确定

要知道,K设置得越大,样本划分得就越细,每个簇的聚合程度就越高,误差平方和SSE自然就越小。所以不能单纯像选择初始点那样,用不同的K来做尝试,选择SSE最小的聚类结果对应的K值,因为这样选出来的肯定是你尝试的那些K值中最大的那个。

确定K值的一个主流方法叫“手肘法”。

如果我们拿到的样本,客观存在J个“自然小类”,这些真实存在的小类是隐藏于数据中的。三维以下的数据我们还能画图肉眼分辨一下J的大概数目,更高维的就不能直观地看到了,我们只能从一个比较小的K,譬如K=2开始尝试,去逼近这个真实值J。

  • 当K小于样本真实簇数J时,K每增大一个单位,就会大幅增加每个簇的聚合程度,这时SSE的下降幅度会很大;
  • 当K接近J时,再增加K所得到的聚合程度回报会迅速变小,SSE的下降幅度也会减小;
  • 随着K的继续增大,SSE的变化会趋于平缓。

例如下图,真实的J我们事先不知道,那么从K=2开始尝试,发现K=3时,SSE大幅下降,K=4时,SSE下降幅度稍微小了点,K=5时,下降幅度急速缩水,再后面就越来越平缓。所以我们认为J应该为4,因此可以将K设定为4。


叫“手肘法”可以说很形象了,因为SSE和K的关系图就像是手肘的形状,而肘部对应的K值就被认为是数据的真实聚类数

当然还有其他设定K值的方法,这里不赘述,总的来说还是要结合自身经验多做尝试,要知道没有一个方法是完美的。

而且,聚类有时是比较主观的事,比如下面这组点,真实簇数J是几呢?我们既可以说J=3,也可以就把它分成2个簇。

6.小结

K-Means优点在于原理简单,容易实现,聚类效果好。

当然,也有一些缺点:

  1. K值、初始点的选取不好确定;
  2. 得到的结果只是局部最优;
  3. 受离群值影响大

每个算法都有自己的特点,所以要多学习,掌握不同算法的逻辑、作用、应用场景和优缺点。这样的话,在需要解决实际问题时,就容易结合自身经验,选出最合适的算法模型来达到自己的目标。

参考链接

k-means算法原理以及数学知识
K-means聚类最优k值的选取


本文首发于知乎:机器学习笔记04-KMeans

用人话讲明白聚类算法kmeans相关推荐

  1. excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...

    文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...

  2. 用人话讲明白线性回归LinearRegression

    文章目录 1.什么是回归 2.一元线性回归 3.损失函数 4.最小二乘估计 5.小结 1.什么是回归 当我们学习一门新课程.接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含 ...

  3. 机器学习-Sklearn-07(无监督学习聚类算法KMeans)

    机器学习-Sklearn-07(无监督学习聚类算法KMeans) 学习07 1 概述 1.1 无监督学习与聚类算法 聚类算法又叫做"无监督分类",其目的是将数据划分成有意义或有用的 ...

  4. 《菜菜的机器学习sklearn课堂》聚类算法Kmeans

    聚类算法 聚类算法 无监督学习与聚类算法 sklearn中的聚类算法 KMeans KMeans是如何工作的 簇内误差平方和的定义和解惑 sklearn.cluster.KMeans 重要参数 n_c ...

  5. 聚类算法——kmeans和meanshift

    聚类算法--kmeans和meanshift [转] 1. meanshift 转于http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220 ...

  6. matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette

    怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...

  7. K均值聚类算法(Kmeans)讲解及源码实现

    K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...

  8. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  9. 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut .

    聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster ...

最新文章

  1. MySQL安装使用的2个问题
  2. ubuntu和windows实现互相之间远程控制
  3. 用幻方编码中文nlp任务
  4. python培训出来的有公司要吗-参加Python培训后真的能找到工作吗?上海Python培训...
  5. python简单代码input-【python系统学习05】input函数——实现人机交互
  6. VTK:简单操作之RandomSequence
  7. mysql部署jar_mysql+jar踩坑记录
  8. 煮茶社区AVR开发板第二版[转]
  9. querybuilder 排序_elasticsearch的匹配与排序问题
  10. [转载]Tomcat 6.0 安装配置
  11. caffeine 读操作源码走读 为什么读这么快
  12. Linux Jump Label(x86)
  13. 使用.NET Core 3.0 预览版,Web API和Visual Studio 2019进行ASP.NET Core Blazor游戏开发
  14. Android SurfaceFlinger vsync信号产生与分发
  15. 小学计算机教师面试试题及答案,2019下半年小学信息技术教师资格证面试真题及答案汇总...
  16. 什么是IT行业? IT行业都有哪些职位?
  17. ​​什么是图形工作站?我们日常接触的计算机类别
  18. ActivityManagerService分析
  19. 水晶易表(Xcelsius) 2008 学习
  20. 为什么Jmeter 运行时时到达持续时间不停止?

热门文章

  1. 饥荒 搜不到指定服务器,运行饥荒就直连特定服务器,无需搜索房间名方法图文教程...
  2. 学计算机笔记本8gb够用吗,千元良品学习够用:酷比魔方iPlay40H平板电脑使用体验...
  3. 论文编辑与投稿——投稿SCI 中文文献翻译后如何在Endnote中加入in Chinese
  4. Mysql 常用统计语句
  5. 荣耀的D-Day:跨越科技硬件的“英吉利海峡”
  6. sqlyog及注册码
  7. Jenkins+Docker+K8S+Git+CICD自动化部署
  8. 浅谈 SOLIDWORKS 的同步建模技术 | 产品探索
  9. error: remote origin already exists解决方法以及其他错误
  10. 微信小程序--多张图片下载问题--for循环出现 漏下,乱序。最多下载5张图片的问题解决(附带个人开发小程序源码)