EM 介绍
期望极大值(Expectation Maximization,EM)算法是一种能够得到极大似然参数估计的迭代方法。
令 X 表示已观测变量集,Z 表示隐变量集,θ 表示模型参数,如果想对 θ 作极大似然估计,则最大化对数似然应为:
LL(θ∣X,Z)=lnP(X,Z∣θ)
由于 Z 是隐变量,故无法直接求解。可以通过对 Z 计算期望,来最大化已观测数据的对数“边际似然”:
LL(θ∣X)=lnP(X∣θ)=lnZ∑P(X,Z∣θ)(1)
EM 算法的基本思想:
- E-step:若参数 θ 已知,则根据训练数据推断除最优隐变量 Z 的值。
- M-step:若隐变量 Z 的值已知,则对参数 θ 作极大似然估。
若计算 Z 的期望,以 θ0 为起点,对式1迭代以下步骤直至收敛:
- E-step:基于 θt 推断隐变量 Z 的期望,记作 Zt;
- M-step:基于已观测变量 X 和 Zt 对参数 θ 作极大似然估计,记作 θt+1。
若基于 θt 计算隐变量 Z 的概率分布 P(Z∣X,θt),则 EM 的步骤变成:
- E-step:基于 θt 推断隐变量分布 P(Z∣X,θt),并计算对数似然 LL(θ∣X,z) 关于 Z 的期望:
Q(θ∣θt)=EZ∣X,θtLL(θ∣X,Z)
θi+1=argθmaxQ(θ∣θt)
基于OpenCV实现EM
EM 是一种无监督的机器学习方法,它还可以用于聚类处理上。
OpenCV 提供了 EM 类,可用于实现 EM 算法对高斯混合模型的参数估计:
- 高斯混合模型可以看作是由 K 个单高斯模型组合而成的模型,这 K 个子模型是混合模型的隐变量。
1 2 3 4 5 6 7 8
| cv::Ptr<cv::ml::EM> model=cv::ml::EM::create();
model->setClustersNumber(classes);
bool trainEM(InputArray samples,OutputArray logLikelihoods=noArray(),OutputArray labels=noArray(),OutputArray probs=noArray()) ;
|
使用 EM 算法进行像素聚类进而实现图像分割。
- 将 RGB 属性作为样本,进行聚类。即每一个像素都是一个样本。
效果如下:

代码地址:EM 算法 - Gitee