Processing math: 3%
随笔 - 20  文章 - 0 评论 - 7 阅读 - 58284
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

目录

EM算法(1):K-means 算法

EM算法(2):GMM训练算法

EM算法(3):EM算法运用

EM算法(4):EM算法证明

 

          

                 EM算法(1) : K-means算法

1. 简介

  K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成。这个类的个数一般是认为给定的。

 

2. 原理

  假设给定一个数据集X={x1,x2,...,xN}, 和类的个数K。我们的每个类都用一个中心点\mu_k表示。每个数据集都应该被归为某一个类,那么我们定义r_{nk}:如果\mathbf{x}_n属于类k,则r_{nk}=1;如果\mathbf{x}_n不属于类k,则r_{nk}=0。那么我们就可以定义一个误差函数\mathbf{J}

          \mathbf{J} = \sum_n\sum_kr_{nk}||\mathbf{x}_n - \mu_k||^2

  误差函数直观理解为每个数据点离自己类的中心点的距离之和。那么我们的目标就是 min \mathbf{J}。我们发现,\mathbf{J}r_{nk}\mu_k都是未知的,直接求导的话没有闭式解。所以我们需要换一个方法,这就是所谓的k-keans算法。

  k-means算法分为两步。第一步,假设各个类的中心\mu_k已知,那么所有r_{nk}都可以求出,计算方法采取最近邻原则,即

          r_{nk} = 1  if  k = arg\ min_j||\mathbf{x}_n - \mu_j||^2              (1)   

          r_{nk} = 0  otherwise                        (2)

  第二步,假设所有r_{nk}都已知,将\mathbf{J}\mu_k求导等于零,那么:

          \frac{\partial\mathbf{J}}{\partial\mu_k} = 2\sum_nr_{nk}(\mathbf{x}_n-\mu_k) = 0

  那么很容易得到\mu_k的闭式解:

          \mu_k = \frac{\sum_nr_{nk}\mathbf{x}_n}{\sum_nr_{nk}}

  k-means有更通俗的解释,第一步其实是给每个数据点都分类,分类方法采取最近邻原则;第二步是根据分类的结果,将中心点重新计算,计算方式为类中所有点的中心点。

 

3. 与EM算法的关系

  这就是为什么在EM算法系列中我们要讲k-means算法的原因:k-means是最简单的EM算法。EM算法全称为Expectation-Maximization algorithm。其也是分为两步,第一步叫Expectation,第二步叫Maximization。

  EM算法取名是有其意义的,比如第一步Expectation,顾名思义就是计算期望。那么在k-means算法中,第一步计算r_{nk}其实是计算Expectation的一步。r_{nk}可以看做是\mathbf{x}_n属于各个类的概率,只不过它们取值只有0和1,但也符合概率的定义。那么\mathbf{x}_n 的误差期望就是:\sum_kr_nk||\mathbf{x}_n - \mu_k||^2。那么所有点的误差期望之和为:

          \sum_n\sum_kr_{nk}||\mathbf{x}_n-\mu_k||^2

  我们可以发现,这其实就是k-means算法中的\mathbf{J}

  EM算法第二步就是对求得的期望求最值。那么在k-means算法中,第二步对\mathbf{J}求导等于零其实就是在求最值,这也正好对应EM算法的第二步。所以我们可以看到,其实k-means就是EM算法的一种。

  我们知道,用平方和来计算误差其实就是隐性假设原数据服从高斯分布,那么后续我们会看到,我们用EM算法和高斯分布,也能推导出k-means算法。

 

posted on   Ccien  阅读(2481)  评论(2编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示