EM算法实例

EM算法详解

Nature Biotech在他的一篇EM tutorial文章《Do, C. B., & Batzoglou, S. (2008). What is the expectation maximization algorithm?. Nature biotechnology, 26(8), 897.》中,用了一个投硬币的例子来讲EM算法的思想。

比如两枚硬币A和B,如果知道每次抛的是A还是B,那可以直接估计(见下图a)。

如果不知道抛的是A还是B(这时就刺激了吧,对的,这就是咱们不知情的隐变量),只观测到5轮循环每轮循环10次,共计50次投币的结果,这时就没法直接估计A和B的正面概率。这时,就轮到EM算法出场了(见下图b)。
EM算法实例_第1张图片
下面给出该例子多的matlab代码:

clear ;
sample1=[0 1 1 1 0 0 1 0 1 0];
sample2=[0 0 0 0 1 0 0 0 0 0];
sample3=[0 1 0 0 0 0 0 1 0 0];
sample4=[0 1 0 1 1 1 0 0 1 1];
sample5=[1 0 0 0 1 0 0 0 1 0];
s = [5,5;9,1;8,2;4,6;7,3];
%给定初始值
theta_a =0.51;theta_b=0.65; 
n=5;M=30;
%E步,求在给定初值下的期望
for iter =1:M
    
Pa=zeros(1,n);
Pb=zeros(1,n);
for i=1:n  
   Pa(i) = combntns(10,s(i,1))*theta_a.^s(i,1)*(1-theta_a).^s(i,2);
   Pb(i) = combntns(10,s(i,1))*theta_b.^s(i,1)*(1-theta_b).^s(i,2);
   Pa(i) = Pa(i)/(Pa(i)+Pb(i));
   Pb(i) = 1-Pa(i); 
end

%M步
s_plusa=0;
s_mina = 0;
s_plusb=0;
s_minb =0;
for i=1:n
 s_plusa = s_plusa + Pa(i)*s(i,1);
 s_mina =  s_mina + Pa(i)*s(i,2);
 s_plusb = s_plusb + Pb(i)*s(i,1);
 s_minb =  s_minb + Pb(i)*s(i,2);
end

 theta_a = s_plusa/(s_plusa+s_mina);
 theta_b = s_plusb/(s_plusb+s_minb);
end

你可能感兴趣的:(MATLAB,matlab,算法,数据挖掘)