Kmeans是最简单的聚类算法之一,应用十分广泛,Kmeans以距离作为相似性的评价指标,其基本思想是按照距离将样本聚成不同的簇,两个点的距离越近,其相似度就越大,以得到紧凑且独立的簇作为聚类目标。本文参考PRML一书,详细讲解Kmeans聚类的原理以及图像分割应用。

1. 基本原理

  给定 D D维欧几里得空间的一组数据{x1,...,xN}\left\{ {{x_1},...,{x_N}} \right\},我们的任务是将该组数据聚成 K K个簇(聚类和分类的区别在于分类是有监督的,聚类是无监督的,根据任务设定聚类依据,此处假设聚类个数K是已知的)。不考虑问题背景,单纯从欧几里得空间的角度讲,我们应当将距离较近的点聚为一个簇,不同簇的点之间的距离较远。Kmeans聚类方法就是寻找KK个聚类中心 μk(k=1,...,K) \mu_k\left(k=1,...,K\right),将所有的数据分配到距离最近的聚类中心,使得每个点与其相应的聚类中心距离的平方和最小。
  我们引入二值变量 rnk∈{0,1} r_{nk}\in\left\{0,1\right\}来表示数据点 xn x_n对于聚类 k k的归属(其中n=1,...,Nn=1,...,N, k=1,...,K k=1,...,K),如果数据点 xn x_n属于第 k k聚类,则rnk=1r_{nk}=1,否则为 0 0。如此,我们便可定义如下损失函数:

J=∑n=1N∑k=1Krnk∥∥xn−μk∥∥2(1)J=\sum\limits_{n=1}^N{\sum\limits_{k=1}^K}{r_{nk}{\left\|x_n-\mu_k\right\|}^2}\qquad(1)
该问题的目标就是寻找使得损失函数 J J最小的所有数据点的归属值{rnk}\left\{r_{nk}\right\}和聚类中心 {μk} \left\{\boldsymbol{\mu}_k\right\}。Kmeans算法提供了一种迭代求解方法,在每次迭代中交替优化 rnk r_{nk}和 μk \boldsymbol{\mu}_k。
  第一步,随机选择聚类中心 μk \boldsymbol{\mu}_k的初始值,求取使损失函数 J J最小的数据点的归属值rnkr_{nk}。由 (1) \left(1\right)式容易看出,给定 xn x_n和 μk \boldsymbol{\mu}_k的值,损失函数 J J是rnkr_{nk}的线性函数,而且,由于 xn x_n之间是相互独立的,所以对于每一个 n n,我们只需将该点分配到距离最近的聚类中心,即

rnk={10if k=argminj∥∥xn−μj∥∥2otherwise(2)

{r_{nk}} = \left\{ {\begin{array}{*{20}{c}} 1k = \arg {{\min }_j}{{\left\| {{x_n} - {\mu _j}} \right\|}^2}}\\ 0\end{array}} \right.\qquad(2)  第二步,固定已求得的 rnk r_{nk},再求取使损失函数 J J最小的聚类中心μk\boldsymbol{\mu}_k。给定 rnk r_{nk}的值,损失函数 J J是μk\boldsymbol{\mu}_k的二次函数,令 J J对μk\boldsymbol{\mu}_k的导数为 0 0,我们有
∑n=1Nrnk(xn−μk)=0(3)\sum\limits_{n=1}^N{r_{nk}\left(x_n-\boldsymbol{\mu}_k\right)}=0\quad(3)
那么 μk \boldsymbol{\mu}_k的取值为

μk=∑nrnkxn∑nrnk(4)

\boldsymbol{\mu}_k=\frac{{\sum\nolimits_n {{r_{nk}}{x_n}} }}{{\sum\nolimits_n {{r_{nk}}} }}\quad(4)对于第 k k个聚类,rnkr_{nk}取1的个数就是属于该聚类的点的个数,因此, μk \boldsymbol{\mu}_k等于属于该聚类的点均值。
 如此迭代该两阶段优化问题直至收敛,Kmeans的实现过程大致表示如下:
(1) 随机选取K个初始聚类中心;
(2) 计算每个样本到各聚类中心的距离,将每个样本归到其距离最近的聚类中心;
(3) 对每个簇,以所有样本的均值作为该簇新的聚类中心;
(4) 重复第(2)~(3)步,直到聚类中心不再变化或达到设定的迭代次数。
  图1为Kmeans算法的实现过程图示,以二聚类为例,首先随机选择两个聚类中心,根据距离将所有的点聚为两个簇(如图1(2)),然后将两个簇以其均值作为新的聚类中心重新聚类。如此迭代,由图可知,经过4次循环,聚类中心不再变化,便完成对该组数据的聚类。由图1(1)可知,初始聚类中心选在了一个簇中,事实上,如果初始聚类中心选择合适,Kmeans聚类收敛速度会非常快,极端情况是,聚类中心恰巧选在了每个簇的中心,无需迭代该聚类问题就已经完成。

图1 Kmeans聚类过程图示

2. 图像分割应用

  彩色图像中的每一个像素是三维空间中的一个点,三维对应红、绿、蓝三原色的强度,基于Kmeans聚类算法的图像分割以图像的像素为数据点,按照指定的簇数进行聚类,然后将每个像素点以其对应的聚类中心替代,重构该图像。如图2所示,不同的聚类簇数呈现不同的色彩特征。


图2 Kmeans用于图像分割

3. Kmeans聚类的缺点

  1) 聚类簇数K没有明确的选取准则,但是在实际应用中K一般不会设置很大,可以通过枚举法,比如令K从2到10。其实很多经典方法的参数都没有明确的选取准则,如PCA的主元个数,可以通过多次实验或者采取一些小技巧来选择,一般都会达到很好的效果。
  2) 从Kmeans算法框架可以看出,该算法的每一次迭代都要遍历所有样本,计算每个样本到所有聚类中心的距离,因此当样本规模非常大时,算法的时间开销是非常大的。
  3) Kmeans算法是基于距离的划分方法,只适用于分布为凸形的数据集,不适合聚类非凸形状的类簇,如图3所示。


图3 Kmeans聚类的缺点

Kmeans聚类及图像分割相关推荐

  1. 机器学习算法实践——K-Means算法与图像分割

    一.理论准备 1.1.图像分割 图像分割是图像处理中的一种方法,图像分割是指将一幅图像分解成若干互不相交区域的集合,其实质可以看成是一种像素的聚类过程.通常使用到的图像分割的方法可以分为: 基于边缘的 ...

  2. 基于Kmeans聚类算法的图像分割(色彩分割)实战

    基于Kmeans聚类算法的图像分割(色彩分割)实战 图像分割是将一幅图像分割成多个像素区域的任务.属于同一对象类型的所有像素都被分配到同一类别下.图像分类是给一副完整的图像一个类别,目标检测是检测到图 ...

  3. 毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割

    @Author:Runsen 图像分割是将图像分割成多个不同区域(或片段)的过程.目标是将图像的表示变成更容易和更有意义的图像. 在这篇博客中,我们将看到一种图像分割方法,即K-Means Clust ...

  4. [Python图像处理] 十九.图像分割之基于K-Means聚类的区域分割

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 基于聚类的“图像分割”案例——K-means聚类算法

    图像分割:利用图像的灰度.颜色.纹理.形状等特征,把图像分成若干个互不重叠的区域,并使这些特征在同一区域内呈现相似性,在不同的区域之间存在明显的差异性.然后就可以将分割的图像中具有独特性质的区域提取出 ...

  6. 基于k-means聚类图像分割+lbp+pca+svm实现烟雾识别(利用matlab仿真实现)

    一.算法简介 1.1 c-means聚类算法 聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象进行分组.目的是使组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的) ...

  7. MATLAB实战系列(三十八)-基于K-means聚类算法的MATLAB图像分割

    前言 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30天带你从入门到精通 MATLAB深入理解高级教程(附源码) tableau可视化数据 ...

  8. 图像分割(一):K-means聚类算法

     K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心 ...

  9. 【图像分割】基于 K-means 聚类算法实现图像区域分割matlab代码

    1 简介 对图像进行颜色区域分割.将图像转换到CIE L*a*b颜色空间,用K均值聚类分析算法对描述颜色的a*和b*通道进行聚类分析;通过提取各个颜色区域独立成为单色的新图像,对图像进行分割处理.实验 ...

最新文章

  1. Android 中文 API 文档 (45) —— AbsoluteLayout.LayoutParams
  2. // synopsys_translate_off,parallel_case 和 full_case
  3. 隐马尔可夫模型:HMM
  4. javascript中break和continue
  5. android新闻app_如何利用 Python 爬虫实现给微信群发新闻早报?
  6. Py IO model
  7. 消息称iPhone 14、14 Max仍采用A15处理器
  8. android编程任务进度条,Android应用开发之AsyncTask 处理耗时操作和显示进度条
  9. IBM服务器渠道销售招聘,热招 | IT客户服务渠道销售,我们在IBM等你!
  10. μVision5界面常用单词解释
  11. html为知笔记模板,为知笔记如何建立模板教程
  12. 都2022年了,我不允许还有人不知道poi-ti这么好用的库
  13. js的初识及数据类型简介
  14. 5G助威云游戏前哨战,科技公司竞逐游戏界“Netflix”名号
  15. 夏普电视的html接口,夏普电视投屏设置方法
  16. 流畅的python第十四章可迭代的对象,迭代器和生成器学习记录
  17. 左支座零件的机械加工工艺规程及工艺装备设计(设计说明书+CAD图纸+任务书+工序卡+过程卡+文献+翻译)
  18. 诺基亚808手机软件java的那款_4100万像素之外有什么? 诺基亚808评测
  19. 区块链革命 - 推荐序一 区块链革命:从失控说起
  20. 基于Matlab的二阶电路的动态电路分析!

热门文章

  1. java执行CMD命令,文件路径或文件名带空格处理
  2. 旋转矩阵及旋转向量相互转化 Rodrigues矩阵及matlab实现
  3. Java实现图书管理系统(超详细解析)
  4. 为用户提供质量好,服务好,运作成本低的云计算产品—记新睿云服务团队顺利完成春节保障任务...
  5. 林业有害生物监测系统(重庆宇创GIS)
  6. 图书管理系统学习与总结
  7. 百度谷歌关键词排名的小技巧,SEO小技巧
  8. java读取OPC DA数据---Utgard
  9. idea E9 OA环境搭建
  10. CHAR.VI 函数装饰器和闭包