码迷,mamicode.com
首页 > 编程语言 > 详细

K-均值聚类算法

时间:2019-10-01 11:27:26      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:image   图片   clust   理想   样本   关联   img   技术   结果   

K-均值(K-Means)算法用于解决无监督学习中聚类问题,其输入为聚类组数量$K$,以及数据集${x^{(1)},x^{(2)},dots,x^{(m)}}$,其中$x^{(i)}inmathbb{R}^n$(不再添加$x^{(i)}_0=1$这一项)。算法步骤为:

技术图片

首先需要随机选取$K$个聚类中心(Cluster Centroid)$mu_1,mu_2,dots,mu_Kinmathbb R^n$。

  • 先计算每个样本与各个聚类中心的距离$|x^{(i)}-mu_k|$,令$c^{(i)}$为距离样本$x^{(i)}$最近聚类中心的索引$k$,即$c^{(i)}=minlimits_k|x^{(i)}-mu_k|$。
  • 然后对每个聚类中心$mu_k$,计算上一步中关联到该聚类的样本的均值(即所有$c^{(i)}=k$的样本$x^{(i)}$的均值),将该均值作为$mu_k$新的值,即找到新的聚类中心。

重复上面的步骤直至算法收敛,即聚类分组情况不再改变。

在算法的迭代过程中,可能遇到某个聚类中心没有关联到任何样本的情况(即没有样本与该聚类中心的距离最近),我们的解决办法通常是随机指定一个新的聚类中心替换掉它,或者直接淘汰该聚类组。

由上面的过程得知K-均值算法的代价函数为:

优化目标是:

K-均值算法的代价函数又称为畸变函数(Distortion Function),在迭代过程中,代价函数的值不可能增大,应该是一直减小的。

关于$K$个聚类中心的初始化,我们通常在数据集中选择$K$个不同的样本作为聚类中心的初始值。另外需要注意的是,选择不同的聚类中心初始值,可能使算法收敛于不同的结果,可能收敛于局部最优解而非全局最优解,如下图所示:

技术图片

右上角的结果为最优解,但如果聚类中心的初始值不同,可能收敛于下面两张图片表示的非最优解。

为避免这种情况,我们往往会多次运行K-均值算法,每次随机选择聚类中心的初始值,然后找到使代价函数值最小的聚类分组情况,作为我们最终的聚类分组结果。不过这种方法往往在聚类组数量较小时使用(通常为$Klt10$),如果$K$很大,即使算法没有收敛于全局最优解,往往也能输出理想的聚类分组结果,使用该方法的收效可能不大。

另外一个问题是如何选择聚类组数量$K$。显然,在聚类问题中,聚类组数目$K$通常应该小于样本数$m$。有时我们可能会使用“肘部法则”帮助我们选择$K$,其原理是在不同的$K$值下,计算算法收敛后的代价函数值,我们可能会得到如下图所示的“胳膊肘”曲线:

技术图片

随着$K$的增大,$J$的值一定会减小,除非我们的算法收敛于一个糟糕的局部最优解。我们根据上面的函数曲线,选择“肘关节”处$K$的值。但在实际情况中,函数曲线通常不会呈现出“胳膊肘”的形状(曲线较为平滑,没有斜率急剧变小的点),我们更普遍的做法依然是根据具体的问题和需求指定$K$的值。

原文:大专栏  K-均值聚类算法


K-均值聚类算法

标签:image   图片   clust   理想   样本   关联   img   技术   结果   

原文地址:https://www.cnblogs.com/petewell/p/11614980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!