用人话讲明白聚类算法kmeans
文章目录
- 1.什么是聚类
- 2.K-Means步骤
- 3.K-Means的数学描述
- 4.初始中心点怎么确定
- 5.K值怎么确定
- 6.小结
1.什么是聚类
先来回顾一下本系列第一篇就讲到的机器学习的种类。
监督式学习:训练集有明确答案,监督学习就是寻找问题(又称输入、特征、自变量)与答案(又称输出、目标、因变量)之间关系的学习方式。监督学习模型有两类,分类和回归。
• 分类模型:目标变量是离散的分类型变量;
• 回归模型:目标变量是连续性数值型变量。
无监督学习:只有数据,无明确答案,即训练集没有标注目标变量。常见的无监督学习算法有聚类(clustering),由计算机自己找出规律,把有相似属性的样本放在一组,每个小组也称为簇(cluster)。
最早的聚类分析是在考古分类、昆虫分类研究中发展起来的,目的是找到隐藏于数据中客观存在的“自然小类”,“自然小类”具有类内结构相似、类间结构差异显著的特点,通过刻画“自然小类”可以发现数据中的规律、揭示数据的内在结构。
之前一起学了回归算法中超级典型的线性回归,分类算法中非常难懂的SVM,这两都是有监督学习中的模型,那今天就来看看无监督学习中最最基础的聚类算法——K-Means Cluster吧。
2.K-Means步骤
K-Means聚类步骤是一个循环迭代的算法,非常简单易懂:
- 假定我们要对N个样本观测做聚类,要求聚为K类,首先选择K个点作为初始中心点;
- 接下来,按照距离初始中心点最小的原则,把所有观测分到各中心点所在的类中;
- 每类中有若干个观测,计算K个类中所有样本点的均值,作为第二次迭代的K个中心点;
- 然后根据这个中心重复第2、3步,直到收敛(中心点不再改变或达到指定的迭代次数),聚类过程结束。
以二维平面中的点Xi=(xi1,xi2),i=1,...,nX_{i}=(x_{i1},x_{i2}),i=1,...,nXi=(xi1,xi2),i=1,...,n为例,用图片展示K=2时的迭代过程:
- 现在我们要将(a)图中的n个绿色点聚为2类,先随机选择蓝叉和红叉分别作为初始中心点;
- 分别计算所有点到初始蓝叉和初始红叉的距离,Xi=(xi1,xi2)X_{i}=(x_{i1},x_{i2})Xi=(xi1,xi2)距离蓝叉更近就涂为蓝色,距离红叉更近就涂为红色,遍历所有点,直到全部都染色完成,如图(b);
- 现在我们不管初始蓝叉和初始红叉了,对于已染色的红色点计算其红色中心,蓝色点亦然,得到第二次迭代的中心,如图(c );
- 重复第2、3步,直到收敛,聚类过程结束。
怎么样,很简单吧?看完K-Means算法步骤的文字描述,我们可能会有以下疑问:
- 第一步中的初始中心点怎么确定?随便选吗?不同的初始点得到的最终聚类结果也不同吗?
- 第二步中点之间的距离用什么来定义?
- 第三步中的所有点的均值(新的中心点)怎么算?
- 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∑Kx∈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∑Kx∈Ci∑(Ci−x)2=i=1∑Kx∈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⇒miCi=x∈Ci∑x⇒Ci=mi1x∈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:
- 把样本点分到最近邻的簇中,这样会降低SSE的值;
- 重新优化聚类中心点,进一步的减小了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优点在于原理简单,容易实现,聚类效果好。
当然,也有一些缺点:
- K值、初始点的选取不好确定;
- 得到的结果只是局部最优;
- 受离群值影响大
每个算法都有自己的特点,所以要多学习,掌握不同算法的逻辑、作用、应用场景和优缺点。这样的话,在需要解决实际问题时,就容易结合自身经验,选出最合适的算法模型来达到自己的目标。
参考链接:
k-means算法原理以及数学知识
K-means聚类最优k值的选取
本文首发于知乎:机器学习笔记04-KMeans
用人话讲明白聚类算法kmeans相关推荐
- excel计算二元线性回归_用人话讲明白梯度下降Gradient Descent(以求解多元线性回归参数为例)...
文章目录 1.梯度 2.多元线性回归参数求解 3.梯度下降 4.梯度下降法求解多元线性回归 梯度下降算法在机器学习中出现频率特别高,是非常常用的优化算法. 本文借多元线性回归,用人话解释清楚梯度下降的 ...
- 用人话讲明白线性回归LinearRegression
文章目录 1.什么是回归 2.一元线性回归 3.损失函数 4.最小二乘估计 5.小结 1.什么是回归 当我们学习一门新课程.接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含 ...
- 机器学习-Sklearn-07(无监督学习聚类算法KMeans)
机器学习-Sklearn-07(无监督学习聚类算法KMeans) 学习07 1 概述 1.1 无监督学习与聚类算法 聚类算法又叫做"无监督分类",其目的是将数据划分成有意义或有用的 ...
- 《菜菜的机器学习sklearn课堂》聚类算法Kmeans
聚类算法 聚类算法 无监督学习与聚类算法 sklearn中的聚类算法 KMeans KMeans是如何工作的 簇内误差平方和的定义和解惑 sklearn.cluster.KMeans 重要参数 n_c ...
- 聚类算法——kmeans和meanshift
聚类算法--kmeans和meanshift [转] 1. meanshift 转于http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220 ...
- matlab中的聚类算法,kmeans聚类算法matlab matlab 聚类算法silhouette
怎样用matlab实现多维K-means聚类算法小编觉得一个好的周末应该是这样的:睡到中午醒来,在床上躺着玩两个小时手机,起床随便吃点东西,下午去超市买一大堆零食,五六点的时候去约小伙伴们吃火锅烧烤, ...
- K均值聚类算法(Kmeans)讲解及源码实现
K均值聚类算法(Kmeans)讲解及源码实现 算法核心 K均值聚类的核心目标是将给定的数据集划分成K个簇,并给出每个数据对应的簇中心点.算法的具体步骤描述如下. 数据预处理,如归一化.离群点处理等. ...
- 机器学习实战-61:K均值聚类算法(K-Means)
K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...
- 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut .
聚类算法是ML中一个重要分支,一般采用unsupervised learning进行学习,本文根据常见聚类算法分类讲解K-Means, K-Medoids, GMM, Spectral cluster ...
最新文章
- MySQL安装使用的2个问题
- ubuntu和windows实现互相之间远程控制
- 用幻方编码中文nlp任务
- python培训出来的有公司要吗-参加Python培训后真的能找到工作吗?上海Python培训...
- python简单代码input-【python系统学习05】input函数——实现人机交互
- VTK:简单操作之RandomSequence
- mysql部署jar_mysql+jar踩坑记录
- 煮茶社区AVR开发板第二版[转]
- querybuilder 排序_elasticsearch的匹配与排序问题
- [转载]Tomcat 6.0 安装配置
- caffeine 读操作源码走读 为什么读这么快
- Linux Jump Label(x86)
- 使用.NET Core 3.0 预览版,Web API和Visual Studio 2019进行ASP.NET Core Blazor游戏开发
- Android SurfaceFlinger vsync信号产生与分发
- 小学计算机教师面试试题及答案,2019下半年小学信息技术教师资格证面试真题及答案汇总...
- 什么是IT行业? IT行业都有哪些职位?
- ​​什么是图形工作站?我们日常接触的计算机类别
- ActivityManagerService分析
- 水晶易表(Xcelsius) 2008 学习
- 为什么Jmeter 运行时时到达持续时间不停止?
热门文章
- 饥荒 搜不到指定服务器,运行饥荒就直连特定服务器,无需搜索房间名方法图文教程...
- 学计算机笔记本8gb够用吗,千元良品学习够用:酷比魔方iPlay40H平板电脑使用体验...
- 论文编辑与投稿——投稿SCI 中文文献翻译后如何在Endnote中加入in Chinese
- Mysql 常用统计语句
- 荣耀的D-Day:跨越科技硬件的“英吉利海峡”
- sqlyog及注册码
- Jenkins+Docker+K8S+Git+CICD自动化部署
- 浅谈 SOLIDWORKS 的同步建模技术 | 产品探索
- error: remote origin already exists解决方法以及其他错误
- 微信小程序--多张图片下载问题--for循环出现 漏下,乱序。最多下载5张图片的问题解决(附带个人开发小程序源码)