场景:某个数据集中有一些数据是缺失的,那么这些数据填充为多少比较合适。这是一个比较有研究意义的问题。
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 ) 这样 X和Z 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 计算出其似然函数:
使用对数似然
选择参数初值 θ θ ,开始迭代
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 直到收敛
因为假设数据服从正态分布,这里的对数似然函数就变为估计正态分布的参数,不断刷新参数,计算 θ θ 直到满足预设阈值就行(阈值一般是较小的正数 θ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 )
密度函数为:
好难组织语言,代码实现在这里
:https://github.com/HCMY/ycimpute/blob/master/ycimpute/unsupervised/expectation_maximization.py