本文大部分內容翻譯自Answers.com的Expectation-maximization algorithm 詞條。
對於一個不完整的樣本集,假設y爲觀測(已知)數據,z爲丟失數據,z和y構成了完整的數據。z可以爲丟失的觀測量,也可以 是隱含的變量,如果這些變量已知的話將會簡化問題的求解。例如,在混合模型中,如果產生樣本點的各個成分的分佈爲已知,則可以大大簡化似然函數的計算。
假設p爲完整數據的聯合概率密度函數,該函數具有參數θ:,它也可以看成是完整數據的似然函數(即樣本集(y,z)具有θ分佈函數的相似性),一個關於θ的函數。進一步,根據貝葉斯公式和全概率公式,丟失數據對於觀測數據的條件分佈爲:
這個式子僅要求計算觀測數據對於丟失數據的條件概率(似然函數)和丟失數據的分佈概率。(分母僅爲歸一化需要)
EM算法通過迭代方法,構造更好的 θ1,θ2,... ,逐步優化初始的 θ0, θ的遞推優化公式通過下式得到:
Q(θ)是對數似然函數ln的 期望。換句話說,我們不知道所有數據的值,所以我們不知道似然函數的準確值,但是對於給定的觀測數據y,我們可以得到未知的z的概率分佈,對於每一個丟失 的觀測(z中的一個元素),都有一個關於θ的似然值,這樣我們就可以計算似然函數的數學期望。這個期望顯然受到θ的值的影響。
Q(θ)通過下式得到:
或者,更普遍地,可以寫成條件期望的形式
應該清楚, 這裏關於的條件期望中用到的z的條件分佈(前一個式子中的第一項)是在固定θn的情況下取得的。用對數似然代替直接的似然函數,可以在保證極值位置不變的情況下簡化計算。也就是說,θn + 1是通過在θn 的基礎上,最大化所有數據關於已知數據的條件期望E而取得的。
當樣本集合的最大似然估計比較容易獲得時,EM算法更爲有用。如果似然估計具有給定的形式,則M步就非常簡單。一個經典的例子是用於有限的高斯混合模型的最大似然估計,如果混合分佈已知,則可以很容易得到各個成分的分佈。高斯混合模型
假設n個高斯分佈,從中產生m個樣本,每一個 yj 所從屬的分佈用 zj 表示,zj 的取值範圍爲1到n。對於任意的y,其來自第i個高斯分佈的概率爲
我們的任務是估計未知的參數,即每一個高斯分佈的均值、方差和先驗概率。
首先我們必須設定初始值。對於無監督的聚類,我們首先必須爲每一個樣本指定一個類別,這一步可以通過其他的聚類方法實現,如K-means方法,求出各個類別的中心和每一個樣本的類別。然後求出各個類別中樣本的協方差陣,可以用每個類別中樣本的個數來表示該類別的權重(先驗概率)。
E-step
使用上一次M步中得到的參數θ,計算未知的z(即每一個分類)對於觀測數據的條件分佈,即,在當前參數θn 下,對每一個樣本,計算各個類別的後驗概率。 下式中第三個等號後面的分子的第一項,爲每一個樣本在類別i中的分佈概率,分子中的第二項爲每一個類別的先驗概率。
分母爲歸一化,即對每一個樣本,其在各個類別中的分佈概率的和爲1.
for ti = 1:Ncluster
PyatCi = mvnpdf(featurespace,Mu(ti,:),Sigma(:,:,ti));
E(:,ti) = PyatCi*Weight(ti);
end
Esum = sum(E,2);
for ti = 1:Ncluster
E(:,ti) = E(:,ti)./Esum;
end
M-step
爲了最大化聯合分佈的對數似然函數的期望
上式需要滿足先驗概率歸一化的要求:
爲了求得Q(θ)的極大值的位置,引入拉格朗日算子 ,然後帶入概率密度函數,
爲了求得新的 θt + 1,我們需要找出上式取得極值時對應的θ,即其一階導數。
下面推導滿足上式的均值,
for ti = 1:Ncluster
muti = E(:,ti)'*featurespace;
muti = muti/sum(E(:,ti));
Mu(ti,:) = muti;
end
產生新的協方差矩陣
新的各個分類的權重
進行歸一化處理
Inserting λ into our estimate:
將新的參數,均值、方差、分類的先驗概率,帶入E步,重新計算,直到樣本集合對各個分類的似然函數不再有明顯的變化爲止。
http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=8636
function L = Likelihood(X,k,W,M,V)
% Compute L based on K. V. Mardia, "Multivariate Analysis", Academic Press, 1979, PP. 96-97
% to enchance computational speed
% a subfunction from Patrick P. C. Tsui's EM_GM code.
[n,d] = size(X);
U = mean(X)';
S = cov(X);
L = 0;
for i=1:k,
iV = inv(V(:,:,i));
L = L + W(i)*(-0.5*n*log(det(2*pi*V(:,:,i))) ...
-0.5*(n-1)*(trace(iV*S)+(U-M(:,i))'*iV*(U-M(:,i))));
end