EM算法及python实现

EM算法描述及应用

场景:某个数据集中有一些数据是缺失的,那么这些数据填充为多少比较合适。这是一个比较有研究意义的问题。
EM很适合解决这个问题:
最大期望算法(Expectation-maximization algorithm,又译期望最大化算法)在统计中被用于寻找,依赖于不可观察的隐性变量的概率模型中(此处理解为缺失值),参数的最大似然估计。

在统计计算中,最大期望(EM)算法是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。最大期望算法经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。最大期望算法经过两个步骤交替进行计算,第一步是计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值;第二步是最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。
引自知乎

你知道一些东西(观察的到的数据),
你不知道一些东西(观察不到的),你很好奇,想知道点那些不了解的东西。怎么办呢,你就根据一些假设(parameter)先猜(E-step),把那些不知道的东西都猜出来,假装你全都知道了;
然后有了这些猜出来的数据,你反思一下,更新一下你的假设(parameter), 让你观察到的数据更加可能(Maximize
likelihood; M-stemp); 然后再猜,在反思,最后,你就得到了一个可以解释整个数据的假设了。

我们用 X=(x1,x2...,xn) X = ( x 1 , x 2 . . . , x n ) 表示观测数据,用 Z=(z1,z2...,zs) Z = ( z 1 , z 2 . . . , z s ) 这样 XZ X 和 Z 一起组成了完整的数据。 Z Z 可能是实际测量丢失的数据,也可能是能够简化问题的隐藏变量, 我们要用EM去得出缺失的估计值。

极大似然估计

给定一个概率分布 D D ,已知其概率密度函数(连续分布)或概率质量函数(离散分布)为 fD f D ,以及一个分布参数 θ θ ,我们可以从这个分布中抽出一个具有 n n 个值的采样 x1,x2,x3,....,xn x 1 , x 2 , x 3 , . . . . , x n ,利用 fD f D 计算出其似然函数:

linkehood(θ|x1,x2,x3,....,xn)=fθ(x1,x2,x3,....,xn) l i n k e h o o d ( θ | x 1 , x 2 , x 3 , . . . . , x n ) = f θ ( x 1 , x 2 , x 3 , . . . . , x n )

D D 是离散分布, fθ f θ 即是在参数为 θ θ 时观测到这一采样的概率。若其是连续分布, fθ f θ 则为 x1,x2,x3,....,xn x 1 , x 2 , x 3 , . . . . , x n 联合分布的概率密度函数在观测值处的取值。一旦我们获得 x1,x2,x3,....,xn x 1 , x 2 , x 3 , . . . . , x n ,我们就能求得一个关于 θ θ 的估计。最大似然估计会寻找关于 θ θ 的最可能的值(即,在所有可能的 θ θ 取值中,寻找一个值使这个采样的“可能性”最大化)。从数学上来说,我们可以在 θ θ 的所有可能取值中寻找一个值使得似然函数取到最大值。这个使可能性最大的 θ^ θ ^ 的最大似然估计。由定义,最大似然估计是样本的函数。

EM的似然函数:

P(X|θ)=ZP(Z|θ)P(Y|Z,θ) P ( X | θ ) = ∑ Z P ( Z | θ ) P ( Y | Z , θ )

假定给定观测数据 X X ,则其概率分布就是 P(Y|θ) P ( Y | θ ) ;其中 θ θ 就是我们需要估计的参数,在这里我们假设数据服从正态分布,那么参数就是 θ=μ,σ θ = μ , σ 。不完全数据的似然函数就是 P(Z|θ) P ( Z | θ ) X X , Z Z 的联合概率分布是 P(Y,Z|θ) P ( Y , Z | θ ) ; 在给定数据X和当前参数估计 θ θ 的情况下,隐藏变量 Z Z 的 概率分布为 P(Z|Y,θi) P ( Z | Y , θ i )

EM过程:

使用对数似然

选择参数初值 θ θ ,开始迭代
E setp: Q(θ,θi)=zlog(P(Y,Z|θ)P(Z|Y,θi)) Q ( θ , θ i ) = ∑ z log ⁡ ( P ( Y , Z | θ ) P ( Z | Y , θ i ) )
M-step:求使 Q(θ,θi) Q ( θ , θ i ) 极大化的 θ θ 作为第 i+1 i + 1 次迭代的参数估计值 θ(i+1) θ ( i + 1 )
θ(i+1)=argmaxQ(θ,θi) θ ( i + 1 ) = a r g m a x Q ( θ , θ i )
重复E、M step 直到收敛

可用于算法实现的EM过程为:

因为假设数据服从正态分布,这里的对数似然函数就变为估计正态分布的参数,不断刷新参数,计算 θ θ 直到满足预设阈值就行(阈值一般是较小的正数 θi+1θi<ϵ θ i + 1 − θ i < ϵ ):
lik(θ|X)=logf(μ,σ2|x1,x2,...xn) l i k ( θ | X ) = log ⁡ f ( μ , σ 2 | x 1 , x 2 , . . . x n )

为了方便估计正态分布的参数以及概率密度函数值 f f (这里是多元正态分布):

密度函数为:

fx(x1,x2,...xn)=12πk||exp(12(xμ)T1(xμ)) f x ( x 1 , x 2 , . . . x n ) = 1 2 π k | ∑ | e x p ( − 1 2 ( x − μ ) T ∑ − 1 ( x − μ ) )

此处: 为 协方差矩阵的行列式

好难组织语言,代码实现在这里
:https://github.com/HCMY/ycimpute/blob/master/ycimpute/unsupervised/expectation_maximization.py

你可能感兴趣的:(EM算法及python实现)