EM算法的简单解释

食堂的大师傅炒了一份菜,要等分成两份给两个人吃——显然没有必要拿来天平一点一点的精确的去称分量,最简单的办法是先随意的把菜分到两个碗中,然后观察是否一样多,把比较多的那一份取出一点放到另一个碗中,这个过程一直迭代地执行下去,直到大家看不出两个碗所容纳的菜有什么分量上的不同为止


EM算法就是这样,假设我们估计知道A和B两个参数,在开始状态下二者都是未知的,并且知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止。


在概率和统计学中,一个随机变量的期望值是变量的输出值乘以其机率的总和,换句话说,期望值是该变量输出值的平均数

 如果X是在概率空间(Ω, P)中的一个随机变量,那么它的期望值E[X]的定义是

E[X] = ∫ΩX dP

 离散:E X =

### EM算法简单应用实例 EM(Expectation-Maximization)算法是一种迭代优化方法,广泛应用于含有隐变量的概率模型参数估计问题中。以下是基于提供的参考资料以及专业知识的一个简单应用实例。 #### 应用场景描述 假设有一组数据样本 \(X\) 来自两个高斯分布的混合模型 (Gaussian Mixture Model, GMM),但不知道每个样本属于哪个高斯分布。目标是通过最大似然估计来求解这两个高斯分布的均值 \(\mu_1\), \(\mu_2\) 和方差 \(\sigma_1^2\), \(\sigma_2^2\) 的最佳参数组合[^1]。 --- #### 实现过程概述 EM算法分为两步:E-step(期望步)和M-step(最大化步)。 - **E-step**: 计算给定当前参数下,每个样本属于不同类别的概率。 - **M-step**: 基于这些概率重新计算新的参数以使似然函数最大化。 下面给出具体的Python代码实现: ```python import numpy as np from scipy.stats import norm def em_algorithm(data, mu_init, sigma_init, pi_init, tol=1e-6, max_iter=100): """ 使用EM算法拟合高斯混合模型 参数: data: 输入的数据集 (numpy array) mu_init: 初始均值猜测 [μ₁, μ₂] sigma_init: 初始标准差猜测 [σ₁, σ₂] pi_init: 初始类别权重 [π₁, π₂] tol: 收敛阈值 max_iter: 最大迭代次数 返回: mu_final: 最终均值 [μ₁*, μ₂*] sigma_final: 最终标准差 [σ₁*, σ₂*] pi_final: 最终权重 [π₁*, π₂*] """ mu = np.array(mu_init).copy() sigma = np.array(sigma_init).copy() pi = np.array(pi_init).copy() log_likelihood_prev = float('inf') for _ in range(max_iter): # E-step: Compute responsibilities resp = [] for k in range(2): # Assuming two components likelihood_k = norm.pdf(data, loc=mu[k], scale=sigma[k]) marginal_likelihood = sum([pi[j]*norm.pdf(data, loc=mu[j], scale=sigma[j]) for j in range(2)]) responsibility_k = (pi[k] * likelihood_k) / marginal_likelihood resp.append(responsibility_k) resp = np.vstack(resp).T # Shape: (n_samples, n_components) # M-step: Update parameters Nk = np.sum(resp, axis=0) # Effective number of points assigned to each component pi_new = Nk / len(data) mu_new = np.dot(resp.T, data) / Nk[:, None].flatten() # Weighted mean by responsibilities sigma_new = np.sqrt(np.dot(resp.T, (data - mu)**2) / Nk[:, None]).flatten() # Weighted variance # Update values mu = mu_new.copy() sigma = sigma_new.copy() pi = pi_new.copy() # Calculate new log-likelihood log_likelihood = np.log(sum([pi[j]*norm.pdf(data, loc=mu[j], scale=sigma[j]) for j in range(2)])).sum() # Check convergence if abs(log_likelihood - log_likelihood_prev) < tol: break log_likelihood_prev = log_likelihood return mu, sigma, pi # Example usage with synthetic dataset np.random.seed(42) true_mu = [1.5, 5.0] true_sigma = [0.8, 1.2] weights = [0.4, 0.6] samples_component1 = np.random.normal(true_mu[0], true_sigma[0], int(weights[0]*100)) samples_component2 = np.random.normal(true_mu[1], true_sigma[1], int(weights[1]*100)) data = np.concatenate((samples_component1, samples_component2)) initial_guesses = { 'mu': [1.0, 4.0], 'sigma': [1.0, 1.0], 'pi': [0.5, 0.5] } estimated_params = em_algorithm(data, initial_guesses['mu'], initial_guesses['sigma'], initial_guesses['pi']) print(f"Estimated Parameters:\nMu={estimated_params[0]}, Sigma={estimated_params[1]}, Pi={estimated_params[2]}") ``` 上述代码展示了如何利用EM算法对一个简单的二维高斯混合模型进行参数估计[^2]。 --- #### 结果解释 运行以上程序后,可以获得接近真实值的最佳参数估计结果。这表明即使初始条件不理想,经过多次迭代之后仍能逼近全局最优解[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值