本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
🌵文章目录🌵
- 🎯 1. 基本介绍
- 💡 2. 原理介绍
- 2.1 EM算法
- 2.2 GMM算法
- 🚀 3. 代码实践
- 🚀 4. 注意事项
- 🚀 5. 总结
下滑查看解决方法
🎯 1. 基本介绍
高斯混合模型(Gaussian Mixture Model, GMM)是一种概率模型,它假设数据点是从多个高斯分布中生成的。GMM在聚类分析中非常有用,特别是当数据集包含多个子群体且每个子群体具有不同的特征分布时。
- 在贝叶斯学派,如果知道观测变量以及其分布函数,我们可以通过极大似然或者极大后验的方式去求取相关的分布函数的参数 θ \theta θ,但是当观测数据中含有未知的隐变量时,此时无法通过上述的方式直接去求取相关的分布参数,而EM算法就是为了去解决这个问题的
- 相关问题:三个硬币,每次选一个硬币去抛,记录3次的结果,现在想要知道三个硬币都为正面的概率,就是求解三个硬币的模型参数
- EM算法的应用有Kmeans算法、GMM混合模型
- em算法的基本思想就是在给定初始参数的情况下,计算隐变量和观测变量的联合分布中隐变量的log期望(也就是建立相关的Q函数),然后在对Q函数进行进行极大似然估计,更新参数 θ \theta θ
💡 2. 原理介绍
2.1 EM算法
- 输入:观测变量Y,隐变量Z,联合分布 P ( Y , Z ∣ θ ) P(Y,Z|\theta) P(Y,Z∣θ), 条件分布 P ( Z ∣ Y , θ ) P(Z|Y, \theta) P(Z∣Y,θ),
- 输出:模型参数 θ \theta θ
- 选择初始化参数 θ ( 0 ) \theta^{(0)} θ(0),开始迭代
- E步, 记 θ ( i ) \theta^{(i)} θ(i)为第i次迭代参数 θ \theta θ的估计值,在第i+1次迭代的E步,计算:
Q ( θ , θ ( i ) ) = E Z [ l o g P ( Y , Z ∣ θ ) ∣ Y , θ ( i ) ] Q(\theta, \theta^{(i)})=E_Z[logP(Y,Z|\theta)|Y, \theta^{(i)}] Q(θ,θ(i))=EZ[logP(Y,Z∣θ)∣Y,θ(i)]
- 由于隐变量为离散的变量,因此:
Q ( θ , θ ( i ) ) = ∑ Z l o g P ( Y , Z ∣ θ ) P ( Z ∣ Y , θ ( i ) ) Q(\theta, \theta^{(i)})=\sum_{Z}logP(Y,Z|\theta)P(Z|Y,\theta^{(i)}) Q(θ,θ(i))=∑ZlogP(Y,Z∣θ)P(Z∣Y,θ(i))
- 其中 P ( Z ∣ Y , θ ( i ) ) P(Z|Y,\theta^{(i)}) P(Z∣Y,θ(i))时在给定观测数据Y和参数估计 θ ( i ) \theta^{(i)} θ(i)下隐变量数据Z的条件概率分布
- M步,求使得 Q ( θ , θ ( i ) ) Q(\theta, \theta^{(i)}) Q(θ,θ(i))极大化的 θ \theta θ,并确定第i+1次迭代的参数估计值 θ ( i + 1 ) \theta^{(i+1)} θ(i+1):
θ ( i ) = a r g m a x θ Q ( θ , θ ( i ) ) \theta^{(i)}=\underset{\theta}{argmax}Q(\theta, \theta^{(i)}) θ(i)=θargmaxQ(θ,θ(i))
- 不断的重复上述的过程,知道算法收敛
- 对于这种非全局最优算法的停止条件,基本都是某个参数不在变化就停止,或者就是某个条件不再变化就算法停止迭代
- 对于EM算法的收敛性是通过Jensen不等式得出的:
t f ( x 1 ) + ( 1 − t ) f ( x 2 ) ⩾ f ( t x 1 + ( 1 − t ) x 2 ) tf(x_1)+(1-t)f(x_2) \geqslant f(tx_1+(1-t)x_2) tf(x1)+(1−t)f(x2)⩾f(tx1+(1−t)x2)
f ( ∑ i = 1 M λ i x i ) ⩽ ∑ i = 1 M λ i f ( x i ) f(\sum_{i=1}^{M}\lambda_ix_i) \leqslant \sum_{i=1}^{M}\lambda_if(x_i) f(∑i=1Mλixi)⩽∑i=1Mλif(xi)
其中第二个式子为第一个式子的泛化形式。
2.2 GMM算法
- EM算法一个很大的应用就是GMM模型,该模型反应的是一堆由多个高斯混合模型生成的数据,每个样本是来自哪个高斯分布,这是个典型的隐变量模型
- 输入高斯混合模型表达式如下:
P ( y ∣ θ ) = ∑ k = 1 K α k ϕ ( y ∣ θ k ) P(y|\theta)=\sum_{k=1}^{K}\alpha_k\phi(y|\theta_k) P(y∣θ)=∑k=1Kαkϕ(y∣θk)
- 在这个问题里,需要估计参数 θ \theta θ
- 明确该问题中的隐变量,写出相关log联合分布函数:
定义 r j k r_{jk} rjk,其中其值为1或者0,为1表示第j个观测变量来自第k个高斯分布
- 因此,可以得出相关的联合分布为:
P ( y , r ∣ θ ) = ∏ j = 1 N P ( y j , r j 1 , r j 2 . . . , r j k ∣ θ ) P(y,r|\theta)=\prod_{j=1}^{N}P(y_j, r_{j1}, r_{j2}...,r_{jk}|\theta) P(y,r∣θ)=∏j=1NP(yj,rj1,rj2...,rjk∣θ)
P ( y , r ∣ θ ) = ∏ k = 1 K ∏ j = 1 N [ α k ϕ ( y i ∣ θ k ) ] r j k P(y,r|\theta)=\prod_{k=1}^{K}\prod_{j=1}^{N}[\alpha_k\phi(y_i|\theta_k)]^{r_{jk}} P(y,r∣θ)=∏k=1K∏j=1N[αkϕ(yi∣θk)]rjk
l o g P ( y , r ∣ θ ) = ∑ k = 1 K [ n k l o g α k + ∑ j = 1 N r j k [ l o g ( 1 2 π ) − l o g σ k − 1 2 σ k 2 ( y i − u k ) 2 ] ] logP(y,r|\theta)=\sum_{k=1}^{K}[n_klog_{\alpha_k}+\sum_{j=1}^{N}r_{jk}[log(\frac{1}{\sqrt{2\pi}})-log \sigma_k-\frac{1}{2\sigma_k^2}(y_i-u_k)^2]] logP(y,r∣θ)=∑k=1K[nklogαk+∑j=1Nrjk[log(2π1)−logσk−2σk21(yi−uk)2]]
- 对上述的Q函数求取期望 E ( Q r j k ) E(Q_{r_{jk}}) E(Qrjk),则:
- E ( r j t ∣ y , θ ) = α k ϕ ( y i ∣ θ k ) ∑ k = 1 K α k ϕ ( y i ∣ θ k ) E(r_{jt}|y, \theta)=\frac{\alpha_k\phi(y_i|\theta_k)}{\sum_{k=1}^{K}\alpha_k\phi(y_i|\theta_k)} E(rjt∣y,θ)=∑k=1Kαkϕ(yi∣θk)αkϕ(yi∣θk),将其代入到Q函数中,可到只含有参数 θ \theta θ的Q函数表达式
- 通过M步对Q函数进行极大似然估计,则可以得出参数 θ \theta θ的更新:
u ^ k = ∑ j = 1 N r ^ j k y j ∑ j = 1 N r ^ j k \hat{u}_k=\frac{\sum_{j=1}^{N}\hat{r}_{jk}y_j}{\sum_{j=1}^{N}\hat{r}_{jk}} u^k=∑j=1Nr^jk∑j=1Nr^jkyj
σ ^ k = ∑ j = 1 N r ^ j k ( y j − u k ) 2 ∑ j = 1 N r ^ j k \hat{\sigma}_k=\frac{\sum_{j=1}^{N}\hat{r}_{jk}(y_j-u_k)^2}{\sum_{j=1}^{N}\hat{r}_{jk}} σ^k=∑j=1Nr^jk∑j=1Nr^jk(yj−uk)2
α ^ k = ∑ j = 1 N r ^ j t N \hat{\alpha}_k=\frac{\sum_{j=1}^{N}\hat{r}_{jt}}{N} α^k=N∑j=1Nr^jt
- 然后不断的重复更新上述的过程,即可得到最终的参数 θ \theta θ
🚀 3. 代码实践
为了更加清晰的看明白gmm算法的执行过程,我们构建相关的数据进行执行,下面为具体的实例:
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 创建GMM模型实例
gmm = GaussianMixture(n_components=4, random_state=42)
# 训练模型
gmm.fit(X)
# 聚类标签
predicted_labels = gmm.predict(X)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=predicted_labels, cmap='viridis', marker='o')
plt.show()
# 打印对数似然值和BIC
print(f"对数似然值: {gmm.score(X)}")
print(f"BIC: {gmm.bic(X)}")
🚀 4. 注意事项
- GMM模型的初始化参数 n_components 需要根据数据集的实际情况进行选择。
- GMM对初始参数敏感,可能需要多次运行以获得稳定的结果。
- GMM模型的聚类数 K 选择可能需要依赖领域知识或模型选择准则。
🚀 5. 总结
GMM是一种强大的聚类工具,适用于数据点来自多个高斯分布的情况。scikit-learn提供了易于使用的GMM实现,允许我们通过指定高斯分布的数量来对数据进行聚类。通过本博客的代码示例,我们学习了如何创建GMM模型,进行训练、聚类标签分配、预测和评估。希望这篇博客能够帮助你更好地理解GMM模型,并将其应用于实际的聚类任务中。