EM算法(Expectation-maximization algorithm)小结

EM算法是一种用于不完全数据的最大似然估计优化算法,由Dempster等人在1977年提出。它通过迭代求解混合高斯分布的参数,涉及隐变量的概念。在数据挖掘、机器学习等领域有广泛应用。算法包括E-step(期望步骤)和M-step(最大化步骤),可能面临收敛速度慢和依赖初始值的问题。

EM算法(Expectation-Maximization algorithm)是一类通过迭代进行极大似然估计的优化算法,今天翻出了之前的笔记,在这里也放一下吧。

EM算法背景

EM(expectation-maximization)算法是Dempster,Laird和Rubin(DLR)三个人在1977年正式提出的.主要是用于在不完全数据的情况下计算最大似然估计.在EM算法正式提出以来,人们对EM算法的性质有更加深入的研究.并且在此基础上,提出了很多改进的算法.在数理统计,数据挖掘,机器学习以及模式识别等领域有广泛的应用.

问题背景

给定一些观察数据y,假设y符合如下的高斯分布:
p(y)=∑k=1KθkN(y∣μk,Σk)p(y)=\sum_{k=1}^{K} \theta_{k} N\left(y \mid \mu_{k}, \Sigma_{k}\right) p(y)=k=1KθkN(yμk,Σk)
需要求出混合高斯分布的三组参数:θk,μk,Σk\theta_{k}, \mu_{k}, \Sigma_{k}θk,μk,Σk
我们注意到,该混合高斯分布一共有K个分布函数,对于每一个观察到的样本y,如果知道它是属于K中的哪个分布,那么求这些参数就会变得很简单。因此我们考虑引入一组新的变量z,用ziz_{i}zi来表示这些高斯分布,那么我们的样本集就会变为{ (y1,z2),(y2,z5),(y3,z1),…}\left\{\left(y_{1}, z_{2}\right),\left(y_{2}, z_{5}\right),\left(y_{3}, z_{1}\right), \ldots\right\}{ (y1,z2),(y2,z5),(y3,z1),}

隐变量

上面提到的新的变量z就是隐藏变量,这是由于实际问题中我们往往不知道每个y属于哪个分布,我们观察不到z.我们引入:Z={ b1,b2,…,bK}Z=\left\{b_{1}, b_{2}, \ldots, b_{K}\right\}Z={ b1,b2,,bK}这里的bKb_{K}bK取0或1,那么就有:p(zk=1)=θkp\left(z_{k}=1\right)=\theta_{k}p(zk=1)=θk,更进一步我们可以得到:
p(Z)=∏k=1Kθkzkp\left(Z\right)=\prod_{k=1}^{K} \theta_{k}^{z_{k}}p(Z)=k=1Kθkzk
最终,我们可以得到:
p(y∣zk=1)=N(y∣μk,Σk)⇒p(y∣Z)=∏k=1KN(y∣uk,Σk)zkp\left(y \mid z_{k}=1\right)=N\left(y \mid \mu_{k}, \Sigma_{k}\right)\\ \Rightarrow p\left(y \mid Z\right)=\prod_{k=1}^{K} N\left(y \mid u_{k}, \Sigma_{k}\right)^{z_{k}}p(y<

高斯混合模型(Gaussian Mixture Model, GMM)是一种常用的概率模型,用于描述由多个高斯分布组成的混合分布。期望最大化(Expectation-Maximization, EM算法是一种迭代算法,用于估计含有隐变量的概率模型的参数。以下是利用一个班级的身高数据来训练GMM并使用EM算法估计模型参数的步骤: ### 步骤1:数据准备 首先,我们需要从CSV文件中读取数据。假设CSV文件包含两列:身高和性别。 ```python import pandas as pd import numpy as np # 读取CSV文件 data = pd.read_csv('height_data.csv') heights = data['height'].values ``` ### 步骤2:初始化GMM参数 我们需要初始化GMM的参数,包括每个高斯分布的均值、协方差和混合系数。 ```python # 初始化参数 num_components = 2 # 假设有两个高斯分布 means = np.random.choice(heights, num_components) covariances = np.array([np.var(heights)] * num_components) mixing_coeffs = np.ones(num_components) / num_components ``` ### 步骤3:定义EM算法 EM算法包括两个步骤:E步(期望步)和M步(最大化步)。 ```python # 定义EM算法 def em_algorithm(data, means, covariances, mixing_coeffs, num_iterations=100): for iteration in range(num_iterations): # E步:计算每个数据点属于每个高斯分布的后验概率 responsibilities = np.zeros((len(data), num_components)) for i in range(num_components): responsibilities[:, i] = mixing_coeffs[i] * np.exp(-(data - means[i])**2 / (2 * covariances[i])) / np.sqrt(2 * np.pi * covariances[i]) # 计算每个数据点属于所有高斯分布的后验概率之和 responsibilities_sum = np.sum(responsibilities, axis=1) # 归一化后验概率 responsibilities /= responsibilities_sum[:, np.newaxis] # M步:更新参数 for i in range(num_components): # 更新均值 means[i] = np.sum(responsibilities[:, i] * data) / np.sum(responsibilities[:, i]) # 更新协方差 covariances[i] = np.sum(responsibilities[:, i] * (data - means[i])**2) / np.sum(responsibilities[:, i]) # 更新混合系数 mixing_coeffs[i] = np.sum(responsibilities[:, i]) / len(data) # 输出当前迭代的损失函数值 loss = -np.sum(np.log(np.sum(mixing_coeffs * np.exp(-(data[:, np.newaxis] - means) ** 2 / (2 * covariances)) / np.sqrt(2 * np.pi * covariances), axis=1))) print(f'Iteration {iteration + 1}: Loss = {loss}') return means, covariances, mixing_coeffs ``` ### 步骤4:训练模型 调用EM算法训练模型。 ```python # 训练模型 means, covariances, mixing_coeffs = em_algorithm(heights, means, covariances, mixing_coeffs, num_iterations=100) ``` ### 步骤5:结果分析 输出训练得到的参数。 ```python print('Means:', means) print('Covariances:', covariances) print('Mixing Coefficients:', mixing_coeffs) ``` 通过以上步骤,我们就可以利用一个班级的身高数据来训练一个高斯混合模型,并使用期望最大化算法来估计模型参数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值