EM算法与NLP

来源:互联网 发布:java怎么卸载干净 编辑:程序博客网 时间:2024/06/08 18:42

EM算法即期望最大化(expectation maximization)方法,是一种解决存在隐含变量优化问题的有效方法。

举个例子,你要统计你们学校男生的平均身高,首先你得抽样,比方说随机选100个男生,然后量一下每个人的身高,把每个人的身高加起来再除以总人数就可以了。如果你要统计你们学校男生和女生的平均身高,首先也得抽样(统计学的精髓就是抽样),比方说随机选了100个男生和100个女生,把每个人的身高量了一下,但是你粗心大意忘了记录每个身高对应的是男生还是女生,也就是说,你现在只知道200个身高,男生和女生的身高服从高斯分布,你不知道每个身高对应的性别,你现在怎么计算男生和女生的平均身高?这时候,性别就是我们所谓的隐变量了。EM方法可以解决你的难题,首先你对每个身高随机给一个性别(对应EM算法初始化隐变量过程),现在你知道了200个身高和对应的性别,你可以计算男生和女生的平均身高了(对应EM方法的M过程),然后根据平均身高(高斯分布)你再去修改每个身高对应的性别。当然这里说的比较简单,旨在直观的了解一下EM方法的过程。

首先需要知道jesen不等式是什么玩意。


假设我们有一个样本集{x(1),…,x(m)}(对应身高),包含m个独立的样本。但每个样本i对应的类别z(i)(对应性别)是未知的(相当于聚类),也即隐含变量。故我们需要估计概率模型p(x,z)的参数θ,但是由于里面包含隐含变量z,所以很难用最大似然求解,但如果z知道了,那我们就很容易求解了。 对于参数估计,我们本质上还是想获得一个使似然函数最大化的那个参数θ,现在与最大似然不同的只是似然函数式中多了一个未知的变量z,见下式。也就是说我们的目标是找到适合的θ和z让L(θ)最大,即当前数据出现的可能性最大。


第一步是对极大似然取对数,第二步是对每个样例的每个可能类别z求联合分布概率和。但是直接求一般比较困难,因为有隐藏变量z存在,但是一般确定了z后,求解就容易了。
 EM是一种解决存在隐含变量优化问题的有效方法。竟然不能直接最大化 L(theta),我们可以不断地建立 L的下界(E步),然后优化下界(M步)。


Y是随机变量X的函数,Y=g(X),那么X是离散型随机变量,它的分布律为P(X=xk)=pk,Y的期望就是E(Y)。根据jesen不等式我们可以从(2)得到(3)。我们利用(3)的上界来近似求解(1)。那么怎么选择Q函数呢?见下图



matlab代码:

clear;
clc;


% Pseudo-code of EM for IBM Model 1:

%  initialize t(e|f) uniformly
%  do until convergence
%    set count(e|f) to 0 for all e,f
%    set total(f) to 0 for all f
%    for all sentence pairs (e_s,f_s)
%      set total_s(e) = 0 for all e
%      for all words e in e_s
%        for all words f in f_s
%          total_s(e) += t(e|f)
%      for all words e in e_s
%        for all words f in f_s
%          count(e|f) += t(e|f) / total_s(e)
%          total(f)   += t(e|f) / total_s(e)
%    for all f
%      for all e
%        t(e|f) = count(e|f) / total(f)
       
sentence=cell(4,1);
sentence{1,1}={'dog','barked','null'};  %english
sentence{2,1}={'hund','bjeffet'};  %french
sentence{3,1}={'dog','bit','dog','null'};
sentence{4,1}={'hund','bet','hund'};


voc_english = containers.Map({'dog','bit','barked','null'},{1,2,3,4});
voc_french = containers.Map({'hund','bet','bjeffet'},{1,2,3});


%initialize t(e|f) uniformly
t(length(voc_english),length(voc_french)) = 0;
for i = 1:length(voc_english)
    for j = 1:length(voc_french)
        t(i,j) = 1/length(voc_french);
    end
end


% EM iterations
maxIter = 50;
count(length(voc_english),length(voc_french)) = 0;
total(length(voc_french)) = 0;
total_s(length(voc_english)) = 0;
while( maxIter > 0 )
    for i = 1:(length(sentence)/2)       % num of sentence pair
        total_s(1:length(voc_english)) = 0;
        for m = 1:length(sentence{2*i-1})
            for n = 1:length(sentence{2*i})
                index_fre = voc_french(sentence{2*i, 1}{n});
                index_eng = voc_english(sentence{2*i-1, 1}{m});
                total_s(index_eng) = total_s(index_eng) + t(index_eng, index_fre);
            end
        end


        for m = 1:length(sentence{2*i-1})
            for n = 1:length(sentence{2*i})
                index_fre = voc_french(sentence{2*i, 1}{n});
                index_eng = voc_english(sentence{2*i-1, 1}{m});
                count(index_eng, index_fre) = count(index_eng, index_fre) + t(index_eng, index_fre)/total_s(index_eng);
                total(index_fre) = total(index_fre) + t(index_eng, index_fre)/total_s(index_eng);
            end
        end
    end
    
    for i = 1:length(voc_french)
        for j = 1:length(voc_english)
        t(j, i) = count(j, i)/total(i);
        end
    end
    maxIter = maxIter - 1;
end
t

本文参考:

http://blog.csdn.net/zouxy09/article/details/8537620

一个EM算法在机器翻译模型IBM1上的应用:

http://www.uio.no/studier/emner/matnat/ifi/INF5820/h12/undervisningsmateriale/emtraining.pdf

0 0
原创粉丝点击