高斯混合模型的期望最大化算法

高斯混合模型的期望最大化算法

本文大部分內容翻譯自Answers.com的Expectation-maximization algorithm 詞條

對於一個不完整的樣本集,假設y爲觀測(已知)數據,z爲丟失數據,z和y構成了完整的數據。z可以爲丟失的觀測量,也可以 是隱含的變量,如果這些變量已知的話將會簡化問題的求解。例如,在混合模型中,如果產生樣本點的各個成分的分佈爲已知,則可以大大簡化似然函數的計算。

假設p爲完整數據的聯合概率密度函數,該函數具有參數θ:p( /mathbf y, /mathbf z | /theta),它也可以看成是完整數據的似然函數(即樣本集(y,z)具有θ分佈函數的相似性),一個關於θ的函數。進一步,根據貝葉斯公式和全概率公式,丟失數據對於觀測數據的條件分佈爲:

p(/mathbf z |/mathbf y, /theta) = /frac{p(/mathbf y, /mathbf z | /theta)}{p(/mathbf y | /theta)} = /frac{p(/mathbf y|/mathbf z, /theta) p(/mathbf z |/theta) }{/int p(/mathbf y|/mathbf /hat{z}, /theta) p(/mathbf /hat{z} |/theta) d/mathbf /hat{z}}

這個式子僅要求計算觀測數據對於丟失數據的條件概率(似然函數)p(/mathbf y|/mathbf z, /theta)和丟失數據的分佈概率p(/mathbf z |/theta)。(分母僅爲歸一化需要)

EM算法通過迭代方法,構造更好的 θ12,... ,逐步優化初始的 θ0, θ的遞推優化公式通過下式得到:

/theta_{n+1} = /arg/max_{/theta}Q(/theta)

Q(θ)是對數似然函數lnp( /mathbf y, /mathbf z | /theta)的 期望。換句話說,我們不知道所有數據的值,所以我們不知道似然函數的準確值,但是對於給定的觀測數據y,我們可以得到未知的z的概率分佈,對於每一個丟失 的觀測(z中的一個元素),都有一個關於θ的似然值,這樣我們就可以計算似然函數的數學期望。這個期望顯然受到θ的值的影響。

Q(θ)通過下式得到:

Q(/theta) =  /sum_z   p /left(z /,|/, y, /theta_n /right)   /log p /left(y, z /,|/, /theta /right)

或者,更普遍地,可以寫成條件期望的形式

Q(/theta) =  E_{/mathbf z} /! /! /left[ /log p /left(/mathbf y, /mathbf z /,|/, /theta /right) /Big| /mathbf y /right],

應該清楚, 這裏關於/log p /left( /mathbf y, /mathbf z /,|/, /theta /right)的條件期望中用到的z的條件分佈(前一個式子中的第一項)是在固定θn的情況下取得的。用對數似然代替直接的似然函數,可以在保證極值位置不變的情況下簡化計算。也就是說,θn + 1是通過在θn  的基礎上,最大化所有數據關於已知數據的條件期望E而取得的。

當樣本集合的最大似然估計比較容易獲得時,EM算法更爲有用。如果似然估計具有給定的形式,則M步就非常簡單。一個經典的例子是用於有限的高斯混合模型的最大似然估計,如果混合分佈已知,則可以很容易得到各個成分的分佈。

高斯混合模型

假設n個高斯分佈,從中產生m個樣本/mathbf y_1, /dots, /textbf{y}_m,每一個 yj 所從屬的分佈用 zj 表示,zj 的取值範圍爲1到n。對於任意的y,其來自第i個高斯分佈的概率爲

P(/mathbf y | z=i,/theta) = /mathcal{N}(/mu_i,/sigma_i) = (2/pi)^{-l/2} {/left| /sigma_i /right|}^{-1/2} /exp/left(-/frac{1}{2}(/mathbf y - /mathbf /mu_i)^T /sigma_i^{-1} (/mathbf y - /mathbf /mu_i)/right)

我們的任務是估計未知的參數/theta = /left/{ /mu_1, /dots, /mu_n, /sigma_1, /dots, /sigma_n, P(z=1), /dots, P(z=n) /right/},即每一個高斯分佈的均值、方差和先驗概率。

首先我們必須設定初始值。

對於無監督的聚類,我們首先必須爲每一個樣本指定一個類別,這一步可以通過其他的聚類方法實現,如K-means方法,求出各個類別的中心和每一個樣本的類別。然後求出各個類別中樣本的協方差陣,可以用每個類別中樣本的個數來表示該類別的權重(先驗概率)。

E-step

使用上一次M步中得到的參數θ,計算未知的z(即每一個分類)對於觀測數據的條件分佈,即,在當前參數θn  下,對每一個樣本,計算各個類別的後驗概率。   下式中第三個等號後面的分子的第一項,爲每一個樣本在類別i中的分佈概率,分子中的第二項爲每一個類別的先驗概率。
分母爲歸一化,即對每一個樣本,其在各個類別中的分佈概率的和爲1.

p(z_j=i|/mathbf y_j,/theta_t)  = /frac{p(z_j=i, /mathbf y_j | /theta_t)}{p(/mathbf y_j|/theta_t)}  = /frac{p(/mathbf y_j|z_j=i,/theta_t) p(z_j=i|/theta_t)}{/sum_{k=1}^n p(/mathbf y_j | z_j=k, /theta_t) p(z_j=k|/theta_t)}

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(/theta)  = /sum_{j=1}^m /sum_{i=1}^n p(z_j=i | /mathbf y_j, /theta_t) /ln /left( p(/mathbf y_j | z_j=i, /theta) p(z_j=i | /theta) /right)

上式需要滿足先驗概率歸一化的要求:

/sum_{i=1}^{n} p(z_j=i|/theta) = 1

爲了求得Q(θ)的極大值的位置,引入拉格朗日算子 ,然後帶入概率密度函數,

/mathcal{L}(/theta) = /left( /sum_{j=1}^m /sum_{i=1}^n p(z_j=i | /mathbf y_j, /theta_t) /left( - /frac{l}{2} /ln (2/pi) - /frac{1}{2} /ln /left| /sigma_i /right| - /frac{1}{2}(/mathbf y_j - /mathbf /mu_i)^T /sigma_i^{-1} (/mathbf y_j - /mathbf /mu_i) + /ln p(z_j=i | /theta) /right) /right) - /lambda /left( /sum_{i=1}^{n} p(z_j=i | /theta) - 1 /right)

爲了求得新的 θt + 1,我們需要找出上式取得極值時對應的θ,即其一階導數/frac{/partial /mathcal{L}(/theta)}{/partial /theta} = 0

下面推導滿足上式的均值,


for ti = 1:Ncluster
    muti = E(:,ti)'*featurespace;
    muti = muti/sum(E(:,ti));
    Mu(ti,:) = muti;
end

產生新的協方差矩陣


新的各個分類的權重


進行歸一化處理

Inserting λ into our estimate:


將新的參數,均值、方差、分類的先驗概率,帶入E步,重新計算,直到樣本集合對各個分類的似然函數不再有明顯的變化爲止。


下面的程序提供了一種快速的似然函數計算方法,摘自Patrick Tsui的EM_GM樣例程序:
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


 
發佈了37 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章