?
期望值最大化方法,是宇宙演变、物种进化背后的动力。
如果一个公司在制定年终奖标准时,把每个员工一半的奖金和公司价值观挂钩,人们就会背诵创始人每个语录 — 整个公司都会自动迭代寻找最优解,每个人说话都是公司价值观。
如果一个国家足球不行,把每个孩子的高考分数和足球水平挂钩,人们就会大力投资足球设施,大爷大妈也会把广场让出去给孙子踢足球,谁跟我孙子抢我真的会发疯 — 整个国家都会自动迭代寻找最优解,每个人说话都是公司价值观。
这个思想在算法中就是期望最大化 EM 算法,只要给出一个收益函数, 计算机就会自动的寻找收益最大的那个点。
?
EM 算法本质是迭代策略,用于含有隐变量的统计模型中,交替计算期望步骤和最大化步骤,来寻找参数的最优估计。
比如看故事书,但故事中有一些缺失的部分(这些就是隐变量)。
你的目标是填补这些缺失部分,使得整个故事变得连贯和合理。
EM 算法就像一个两步循环过程,帮助你逐渐完善这个故事:
期望步骤 (E 步骤): 在这一步,你根据目前所知的信息,对故事中缺失的部分做出最佳猜测。就好比你根据故事的上下文来推测这些缺失部分可能的内容。
最大化步骤 (M 步骤): 接下来,你根据这些猜测来重新讲述整个故事,并调整故事中其他已知部分的细节,使得整体故事更加合理。这个过程就像根据新的假设来优化故事的连贯性。(M步骤可以使用 MLE 或 MAP)。
这个循环反复进行:你根据当前的故事版本来改善你对缺失部分的猜测,然后再用这些新猜测来优化整个故事。
随着每次迭代,故事变得越来越连贯,直到最终达到一个点,你觉得再怎么调整也无法使故事更好了。
这时,你就找到了最合适的版本来填补缺失部分,你找到了模型参数的最优估计。
?
再如 市场营销策略:
公司在设计营销策略时,通常会试图理解消费者的隐藏需求和偏好(隐藏变量),并据此调整其产品或服务(参数)。
通过市场反馈,公司不断调整其策略以最大化销售或品牌影响力,这类似于EM算法的期望步骤和最大化步骤的迭代过程。
概率图模型再复杂都可以简化成俩个变量:观测变量x、隐变量z
比如你正在看一部电影:
p ( x ∣ θ ) = ∏ i = 1 n p ( x i ∣ θ ) L ( θ ) = log ? p ( x ∣ θ ) = ∑ i = 1 n log ? p ( x i ∣ θ ) = ∑ i = 1 n log ? ∑ z p ( x i , z i ∣ θ ) \begin{aligned} &p(\mathbf{x}|\theta) \begin{aligned}=\prod_{i=1}^np(x_i|\theta)\end{aligned} \\ &{ L ( \theta )} =\operatorname{log}p(\mathbf{x}|\theta) \\ &=\sum_{i=1}^n\log p(x_i|\theta) \\ &=\sum_{i=1}^n\log\sum_zp(x_i,z_i|\theta) \end{aligned} ?p(x∣θ)=i=1∏n?p(xi?∣θ)?L(θ)=logp(x∣θ)=i=1∑n?logp(xi?∣θ)=i=1∑n?logz∑?p(xi?,zi?∣θ)?
那我们逐步拆解公式原意:
联合概率分布:
对数似然函数:
对数似然的求和:
边缘概率:
在概率分布上,就是先猜一个 z 的分布(记为 q),使用 E、M 步骤,去逼近真实分布
L
(
θ
)
L(\theta)
L(θ):
最后让猜的分布像爬楼梯一样,找到真实分布
L
(
θ
)
L(\theta)
L(θ) 的最高点(最优解)。
用数学公式描述这个过程:
L ( θ ) = ∑ i = 1 n log ? ∑ z p ( x i , z i ∣ θ ) = ∑ i = 1 n log ? ∑ z ∞ q i ( z ) p ( x i , z i ∣ θ ) q i ( z ) ≥ ∑ i = 1 n ∑ z q i ( z ) log ? p ( x i , z i ∣ θ ) q i ( z ) \begin{aligned} L(\theta)& \begin{aligned}=&\sum_{i=1}^n\log\sum_zp(x_i,z_i|\theta)\end{aligned} \\ &\begin{aligned}=&\sum_{i=1}^n\log\sum_z^\infty q_i(z)\frac{p(x_i,z_i|\theta)}{q_i(z)}\end{aligned} \\ &\geq\sum_{i=1}^n\sum_zq_i(z)\log\frac{p(x_i,z_i|\theta)}{q_i(z)} \\ \end{aligned} L(θ)?=?i=1∑n?logz∑?p(xi?,zi?∣θ)?=?i=1∑n?logz∑∞?qi?(z)qi?(z)p(xi?,zi?∣θ)??≥i=1∑n?z∑?qi?(z)logqi?(z)p(xi?,zi?∣θ)??
第一行: L ( θ ) = ∑ i = 1 n log ? ∑ z p ( x i , z i ∣ θ ) L(\theta) = \sum_{i=1}^n \log \sum_z p(x_i, z_i|\theta) L(θ)=∑i=1n?log∑z?p(xi?,zi?∣θ)
第二行: = ∑ i = 1 n log ? ∑ z ∞ q i ( z ) p ( x i , z i ∣ θ ) q i ( z ) = \sum_{i=1}^n \log \sum_z^\infty q_i(z) \frac{p(x_i, z_i|\theta)}{q_i(z)} =∑i=1n?log∑z∞?qi?(z)qi?(z)p(xi?,zi?∣θ)?
第三行: ≥ ∑ i = 1 n ∑ z q i ( z ) log ? p ( x i , z i ∣ θ ) q i ( z ) \geq \sum_{i=1}^n \sum_z q_i(z) \log \frac{p(x_i, z_i|\theta)}{q_i(z)} ≥∑i=1n?∑z?qi?(z)logqi?(z)p(xi?,zi?∣θ)?
然后根据 Jeasen 不等式,得到公式的下界。
最终的公式是: J ( z , q ) J(z,q) J(z,q)。
于是,EM 算法可分为 E 步骤、M 步骤。
E 步骤:猜的分布 q 不变,最大化 z。
在图中,q 沿着 x 轴上升,碰到真实分布z 就停止,开始 M 步骤。
M 步骤:猜的分布 q 寻优,z 不变。
在图中,q 沿着 y 轴水平移动,碰不到真实分布z 就停止,开始 E 步骤。
EM 算法可能会陷入局部最优。
非凸目标函数:EM算法通常用于优化非凸(non-convex)的目标函数。在非凸函数中,可能存在多个局部最优解,这意味着算法可能会在达到一个局部最优点后停止,而这个点不一定是全局最优的。
初始值依赖性:EM算法的结果往往依赖于初始参数的选择。如果初始参数选得不好,算法可能会被引导到一个局部最优解而不是全局最优解。
迭代方式:EM算法通过交替执行其两个步骤(E步和M步)来逐渐改进参数估计。这种迭代方式可能会导致算法“陷入”某个局部区域的最优解,特别是在目标函数有多个峰值的情况下。
模型复杂性和数据的局限性:在一些复杂模型或者数据不足的情况下,EM算法可能无法准确估计出全局最优参数,从而陷入局部最优。
解决这些问题的一种方法是通过多次运行算法,每次使用不同的初始参数,然后从中选择最好的结果。
此外,还可以使用全局优化技术,如模拟退火或遗传算法,来辅助找到更接近全局最优的解。
假设我们有一组观测数据点,我们认为这些数据点是由两个不同的高斯分布生成的,但我们不知道每个数据点来自哪个高斯分布。
我们的目标是估计这两个高斯分布的参数(均值和方差)以及每个分布对应的混合系数。
import numpy as np
from sklearn.mixture import GaussianMixture
# 模拟数据生成
np.random.seed(0)
data = np.concatenate([np.random.normal(0, 1, 300), np.random.normal(5, 1.5, 700)]).reshape(-1, 1)
# 应用EM算法
gmm = GaussianMixture(n_components=2, random_state=0)
gmm.fit(data)
# 输出结果
print(f'均值: {gmm.means_.ravel()}')
print(f'方差: {gmm.covariances_.ravel()}')
print(f'混合系数: {gmm.weights_.ravel()}')
这段代码首先生成了一些模拟数据,数据是由两个不同的高斯分布合成的。
然后使用sklearn
库中的GaussianMixture
模型来应用EM算法。最后,打印出两个高斯分布的均值、方差以及混合系数。