目录
EM算法(1) : K-means算法
1. 简介
K-means算法是一类无监督的聚类算法,目的是将没有标签的数据分成若干个类,每一个类都是由相似的数据组成。这个类的个数一般是认为给定的。
2. 原理
假设给定一个数据集X={x1,x2,...,xN}, 和类的个数K。我们的每个类都用一个中心点μk表示。每个数据集都应该被归为某一个类,那么我们定义rnk:如果xn属于类k,则rnk=1;如果xn不属于类k,则rnk=0。那么我们就可以定义一个误差函数J:
J=∑n∑krnk||xn−μk||2
误差函数直观理解为每个数据点离自己类的中心点的距离之和。那么我们的目标就是 min J。我们发现,J中rnk和μk都是未知的,直接求导的话没有闭式解。所以我们需要换一个方法,这就是所谓的k-keans算法。
k-means算法分为两步。第一步,假设各个类的中心μk已知,那么所有rnk都可以求出,计算方法采取最近邻原则,即
rnk=1 if k=arg minj||xn−μj||2 (1)
rnk=0 otherwise (2)
第二步,假设所有rnk都已知,将J对μk求导等于零,那么:
∂J∂μk = 2∑nrnk(xn−μk) = 0
那么很容易得到μk的闭式解:
μk=∑nrnkxn∑nrnk
k-means有更通俗的解释,第一步其实是给每个数据点都分类,分类方法采取最近邻原则;第二步是根据分类的结果,将中心点重新计算,计算方式为类中所有点的中心点。
3. 与EM算法的关系
这就是为什么在EM算法系列中我们要讲k-means算法的原因:k-means是最简单的EM算法。EM算法全称为Expectation-Maximization algorithm。其也是分为两步,第一步叫Expectation,第二步叫Maximization。
EM算法取名是有其意义的,比如第一步Expectation,顾名思义就是计算期望。那么在k-means算法中,第一步计算rnk其实是计算Expectation的一步。rnk可以看做是xn属于各个类的概率,只不过它们取值只有0和1,但也符合概率的定义。那么xn 的误差期望就是:∑krnk||xn−μk||2。那么所有点的误差期望之和为:
∑n∑krnk||xn−μk||2
我们可以发现,这其实就是k-means算法中的J。
EM算法第二步就是对求得的期望求最值。那么在k-means算法中,第二步对J求导等于零其实就是在求最值,这也正好对应EM算法的第二步。所以我们可以看到,其实k-means就是EM算法的一种。
我们知道,用平方和来计算误差其实就是隐性假设原数据服从高斯分布,那么后续我们会看到,我们用EM算法和高斯分布,也能推导出k-means算法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现