Kmeans和GMM參數學習的EM算法原理和Matlab實現

本文整理自JerryLead的博文“《K-means聚類算法》 ”,“《(EM算法)The EM Algorithm 》”,“《混合高斯模型(Mixtures of Gaussians)和EM算法 》”,以及自己編寫的關於GMM的Matlab實現。
好的博文還有:
pluskid的《漫談 Clustering (3): Gaussian Mixture Model》和《漫談 Clustering (番外篇): Expectation Maximization》。

K-means和EM

K-means是聚類算法中最簡單的一種,但是裏面包含的思想卻是不一般。聚類屬於無監督學習,樸素貝葉斯、SVM等都是有類別標籤y 的,即已經給出了樣本的分類。而聚類的樣本中卻沒有給定y ,只有特徵x 。聚類的目的是找到每個樣本x 潛在的類別y ,並將同類別y 的樣本x 放在一起。
在聚類問題中,給定訓練樣本{xi}Ni=1 ,每個xiRn ,沒有類別標籤y
K-means算法是將樣本聚類成K 個簇(cluster),具體算法描述如下:

1、隨機選取K 個聚類質心點爲{μk}Kk=1,μkRn
2、重複下面過程直到收斂{
對於每一個樣例i ,計算其應該屬於的類

zi=argminj||xiμj||2

對於每一個類j ,重新計算該類的質心
μj=Ni=11{zi=j}xiNi=11{zi=j}

}

其中,K 是事先給定的聚類數,zi1,2,..,K 代表樣例iK 個類中距離最近的那個類,μj 代表對屬於同一個類的樣本的質心。要將所有的樣本聚成K 類,首先隨機選取K 個點作爲K 個類的質心,第一步對於每一個樣本計算其到K 個質心的距離,選取距離最近的那個類作爲zi (經過第一步每個樣本都有了所屬的類);第二步對於每一個類,重新計算它的質心μj (對裏面所有的樣本座標求平均)。重複迭代第一步和第二步直到質心不變或者變化很小。
K-means如何保證收斂?
K-means算法中強調結束條件就是收斂,可以證明的是K-means完全可以保證收斂性。下面定性的描述一下收斂性,定義畸變函數:

J(z,μ)=i=1N||xiμzi||2

函數J 表示每個樣本點到其質心的距離平方和。K-means就是要將J 調整到最小。假設當前J 沒有達到最小值,那麼可以首先固定每個類的質心μj ,調整每個樣例的所屬類別zi 來讓J 函數減少,同樣固定zi ,調整μj 也可以使J 減小。這兩個過程就是內循環中使J 單調遞減的過程。當J 遞減到最小時,μz 也同時收斂。由於畸變函數J 是非凸函數,意味着不能保證取得的最小值是全局最小值,也就是說K-means對質心初始位置的選取比較敏感,但一般情況下K-means達到的局部最優已經滿足需求。
K-means與EM的關係
K-means算法目的是將樣本分成K 個類,即求每個樣例x 的隱含類別y ,然後利用隱含類別將x 歸類。由於事先不知道類別y ,那麼可以先對每個樣例假定一個y ,但是怎麼知道假定的對不對呢?怎麼評價假定的好不好呢?在此,可以使用樣本的極大似然估計來度量,即xy 的聯合分佈p(x,y) 。如果找到的y 能夠使 p(x,y) 最大,那麼找到的y 就是樣例x 的最佳類別,x 同時就聚類了。但是第一次指定的y 不一定會讓p(x,y) 最大,而且p(x,y) 還依賴於其他未知參數。當然在給定y 的情況下,可以調整其他參數讓p(x,y) 最大;調整完參數後,發現有更好的y 可以指定,那麼重新指定y 。反覆迭代直至沒有更好的y 可以指定。
這個過程有幾個難點:第一,怎麼假定y ?是每個樣例硬指派一個y 還是不同的y 有不同的概率,概率如何度量?第二,如何估計p(x,y)p(x,y) 還可能依賴很多其他參數,如何調整裏面的參數讓p(x,y) 最大。
這可以採用EM的思想解決,E步就是估計隱含類別y 的期望值,M步調整其他參數使得在給定類別y 的情況下,極大似然估計p(x,y) 能夠達到極大值。然後在其他參數確定的情況下,重新估計y ,周而復始,直至收斂。
對應於K-means,最開始對於每個樣例xi 隨便指定一個zi ,然後爲了讓p(x,y) 最大(讓J 最小),求給定zi 情況下最小時的μj (前面提到的其他未知參數),然而此時發現,可以有更好的zi (質心與樣例xi 距離最小的類別)指定給樣例xi ,那麼zi 得到重新調整,上述過程就開始重複了,直到沒有更好的zi 指定。可見K-means裏體現了EM思想,E步是確定隱含類別變量z ,M步更新其他參數μ 來使J 最小化。K-means隱含類別變量指定方法比較特殊,屬於硬指定,即從K 個類別中硬選出一個給樣例,而不是對每個類別賦予不同的概率。總體思想還是一個迭代優化過程,有目標函數,也有參數變量,只是多了個隱含變量,確定其他參數估計隱含變量,再確定隱含變量估計其他參數,直至目標函數最優。

EM算法

下面介紹EM的整個推導過程:

Jensen不等式

f 是定義域爲實數的函數,如果對於所有的實數Xf′′(x)0 ,那麼f 是凸函數。當x 是向量時,如果其Hessian矩陣H 是半正定的,那麼f 是凸函數。如果f′′(x)>0 ,那麼稱f 是嚴格凸函數。
Jensen不等式表述如下:如果f 是凸函數,X 是隨機變量,那麼

E[f(x)]f(E[X])

特別地,如果f 是嚴格凸函數,那麼E[f(x)]=f(E[X]) 當且僅當p(x=E(X))=1 ,也就是說X 是常量。
如果用圖表示會很清晰:
這裏寫圖片描述
圖中實線f 是凸函數,X 是隨機變量,有0.5的概率是a,有0.5的概率是b,X 的期望值就是a和b的中值了,圖中可以看到E[f(x)]f(E[X]) 成立。
f 是(嚴格)凹函數當且僅當f 是(嚴格)凸函數。
Jensen不等式應用於凹函數時,不等號方向反向,即E[f(x)]f(E[X])

EM算法

給定獨立同分布訓練樣本{xi}Ni=1 ,尋找到每個樣例隱含的類別z ,能使得p(x,z) 最大。p(x,z) 的最大似然估計如下:

L(θ)=i=1Nlogp(xi;θ)=i=1Nlogzip(xi,zi;θ)

該式直接求θ 一般比較困難,因爲有隱藏變量z 存在,但是一般確定了z 後,求解就容易了。
EM是一種解決存在隱含變量優化問題的有效方法。既然不能直接最大化L(θ) ,那麼就不斷地建立L(θ) 的下界(E步),然後優化下界(M步)。即對於每一個樣例i ,讓Q(zi) 表示該樣例隱含變量zi 的某種分佈,且ziQ(zi)=1Q(zi)0 。由Jensen不等式得:
L(θ)=i=1Nlogzip(xi,zi;θ)=i=1NlogziQ(zi)p(xi,zi;θ)Q(zi)i=1NziQ(zi)logp(xi,zi;θ)Q(zi)

其中,log(x) 是凹函數且ziQ(zi)p(xi,zi;θ)Q(zi)
[p(xi,zi;θ)/Q(zi)] 的期望。
這個過程可以看作是對L(θ) 求了下界。對於Q 的選擇,有多種可能,那種更好的?假設θ 已經給定,那麼l(θ) 的值就決定於Q(zi)p(xi,zi) 了。通過調整這兩個概率使下界不斷上升,以逼近L(θ) 的真實值,那麼什麼時候算是調整好了呢?當不等式變成等式時,說明調整後的概率能夠等價於L(θ) 。按照這個思路,要找到等式成立的條件。根據Jensen不等式,要想讓等式成立,需要讓隨機變量變成常數值,即:
p(xi,zi;θ)Q(zi)=c

其中,c 爲常數,不依賴於zi 。由於zQ(z)=1 ,所以zip(xi,zi;θ)=1 ,(多個等式分子分母相加不變,這個認爲每個樣例的兩個概率比值都是c ),那麼有下式:
Q(zi)=p(xi,zi;θ)zp(xi,z;θ)=p(xi,zi;θ)p(xi;θ)=p(zi|xi;θ)

至此,導出了在固定其他參數θ 後,Q(zi) 就是後驗概率,解決了Q(zi) 如何選擇的問題。這一步就是E步,建立 L(θ) 的下界。
接下來的M步,就是在給定Q(zi) 後,調整θ ,去極大化L(θ) 的下界。那麼一般的EM算法的步驟如下:

循環重複直到收斂 {
(E步)對於每一個i ,計算

Q(zi)=p(zi|xi;θ)

(M步)計算
θ=argmaxθi=1NziQ(zi)logp(xi,zi;θ)Q(zi)

那麼究竟怎麼確保EM收斂?假定θtθt+1 是EM第t 次和第t+1 次迭代後的結果。如果L(θt)L(θt+1) ,也就是說極大似然估計單調增加,且L(θ) 有界,那麼迭代會到達最大似然估計的最大值。下面證明L(θt)L(θt+1)
固定θt 後,E步

Qt(zi)=p(zi|xi;θt)

該步保證了在給定θt 時,Jensen不等式中的等式成立,即
L(θt)=i=1NziQt(zi)logp(xi,zi;θt)Qt(zi)

固定Qt(zi) ,M步:
θt 視作變量,對L(θt) 求導等於零可得到θt+1 ,則下式成立:
L(θt)=i=1NziQt(zi)logp(xi,zi;θt)Qt(zi)i=1NziQt(zi)logp(xi,zi;θt+1)Qt(zi)i=1NziQt+1(zi)logp(xi,zi;θt+1)Qt+1(zi)=L(θt+1)

證畢。
如果定義
J(Q,θ)=i=1NziQ(zi)logp(xi,zi;θ)Q(zi),

J(Q,θ)L(θ) 的下界。EM可以看作是J 的座標上升法,E步固定θ ,優化Q ,M步固定Q 優化θ

EM和GMM

給定訓練樣本{xi}Ni=1 ,隱含類別標籤用zi 表示。與K-means硬指定不同,GMM認爲zi{1,2,...,K} 滿足多項式分佈ziM(ϕ) ,其中p(zi=j)=ϕjϕj0Kj=1ϕj=1 。假定在給定zi 的條件下xi 滿足多值高斯分佈,即 (xi|zi=j)N(μj,σj) ,則聯合分佈p(xi,zi)=p(xi|zi)p(zi)
GMM:

j=1KϕjN(μj,σj)

對於每個樣例xi ,先從K 個類別中按多項式分佈抽取一個 zi ,然後根據zi 對應高斯分佈生成樣例xi ,該過程稱作混合高斯模型。注意:zi 是GMM的隱含隨機變量,θ=(ϕ,μ,σ) 是GMM的參數,其中:ϕj 是樣本類別中zi=j 的比率,μj 是類別爲j 的樣本特徵均值,σj 是類別爲j 的樣本特徵方差。對數似然函數:
L(ϕ,μ,σ)=logi=1Np(xi;ϕ,μ,σ)=i=1Nlogp(xi;ϕ,μ,σ)=i=1Nlogzi=1Kp(xi,zi;ϕ,μ,σ)=i=1Nlogzi=1Kp(xi|zi;μ,σ)p(zi;ϕ)

該式不存在閉合解。考慮EM的思想,第一步是猜測隱含類別變量 ,第二步是更新其他參數,以獲得最大的最大似然估計。
E步:固定θ=(ϕj,μj,σj) ,求

wi(j)=Q(zi=j;θ)=p(zi=j|xi;θ)=p(xi,zi=j;θ)p(xi;θ)=p(xi|zi=j;μ,σ)p(zi=j;ϕ)Kl=1p(xi|zi=l;μ,σ)p(zi=l;ϕ)=12πσjexp((xiμj)22σ2j)ϕjk=1K12πσkexp((xiμk)22σ2k)ϕk

即每個樣例xi 的隱含類別zij 的概率可以通過後驗概率計算得到。對比K-means發現,每個樣例分配的類別zi 是有一定的概率的,每個樣例i 都要計算屬於每一個類別j 的概率。
M步:固定wi(j) ,最大化

J(θ)=i=1NziQ(zi)logp(xi,zi;θ)Q(zi)=i=1Nj=1KQ(zi=j)logp(xi,zi;θ)Q(zi=j)=i=1Nj=1Kwi(j)log12πσjexp((xiμj)22σ2j)ϕjwi(j)

求參數θ=(ϕj,μj,σj)
μj,σj 求導,得

J(θ)μj=μji=1Nj=1Kwi(j)log1wi(j)+log12πσj(xiμj)22σ2j+logϕj=i=1Nwi(j)[1σ2j(μjxi)μj]

J(θ)σj=σji=1Nj=1Kwi(j)log1wi(j)+log12π+log1σj(xiμj)22σ2j+logϕj=i=1Nwi(j)[1σj+1σ3j(xiμj)2]

令其等於0,解得:
μj=Ni=1wi(j)xiNi=1wi(j)σ2j=Ni=1wi(j)(xiμj)2Ni=1wi(j)

同時,由於ϕj0 ,且Kj=1ϕj=1 ,故建立拉格朗日函數
L(ϕj)=i=1Nwi(j)logϕj+β(Kj=1ϕj1)

其中,ϕj 相關的常數被省略了。對ϕj 求導等於0,結合Kj=1ϕj=1 可解得:
β=i=1Nwi(j)ϕj=j=1Ki=1Nwi(j)j=1Kϕj=i=1Nj=1Kwi(j)=i=1N1=N

即:
ϕj=1Ni=1Nwi(j)

算法過程如下:

循環下面步驟,直到收斂:{
(E步)對於每一個ij 計算

wi(j)=12πσjexp((xiμj)22σ2j)ϕjk=1K12πσkexp((xiμk)22σ2k)ϕk

(M步),更新參數:
ϕj=1Ni=1Nwi(j)μj=Ni=1wi(j)xiNi=1wi(j)σ2j=Ni=1wi(j)(xiμj)2Ni=1wi(j)

}

E步中,將其他參數ϕ,μ,σ 看作常量,計算zi 的後驗概率,也就是估計隱含類別變量。估計好後,利用上面的公式重新計算其他參數,計算好後發現最大化最大似然估計時,wi(j) 值又不對了,需要重新計算,周而復始,直至收斂。

GMM示例

給定由三個高斯的組成的混合模型(K=3 ),其中:第一個高斯的均值μ1=5 、方差σ1=3 ,第二個高斯的均值μ2=20 、方差σ2=5 ,第三個高斯的均值μ3=50 、方差σ3=10 ,且三個高斯出現的概率爲ϕ1=0.2ϕ1=0.4ϕ1=0.4 。由該GMM生成10000個樣本( N=10000 ),並根據樣本和給定的初始參數ϕ=[0.33,0.33,0.34]μ=[0,5,10]σ=[5,5,5] ,迭代學習50次結果後收斂到ϕ=[0.1969,0.4082,0.3950]μ=[4.9686,20.0338,50.0925]σ=[3.0639,5.0977,10.1096] 。下圖給出了10000個樣本的分佈和50次迭代學習參數變化情況。
這裏寫圖片描述

Matlab代碼:

% 生成過程
phi1 = 0.2; mu1 = 5; sigma1 = 3;
phi2 = 0.4; mu2 = 20; sigma2 = 5;
phi3 = 0.4; mu3 = 50; sigma3 = 10;

N = 10000;
x = zeros(N,1);
for i = 1 : N
    rate = rand;
    if rate <= phi1
        x(i) = normrnd(mu1,sigma1);
    elseif rate <= phi1+phi2
        x(i) = normrnd(mu2,sigma2);
    else
        x(i) = normrnd(mu3,sigma3);
    end
end

figure(1); subplot(2,2,1); hist(x,1000);

% 學習過程
mu = [0, 5, 10];
sigma = [5, 5, 5];
phi = [0.33, 0.33, 0.34];
w = zeros(N,3);

T = 50;
mu_ = zeros(T+1,3);
sigma_ = zeros(T+1,3);
phi_ = zeros(T+1,3);
mu_(1,:) = mu;
sigma_(1,:) = sigma;
phi_(1,:) = phi;
for t = 1 : T
    % Expectation
    for k = 1 : 3
        w(:,k) = phi(k)*normpdf(x,mu(k),sigma(k));
    end
    w = w./repmat(sum(w,2),[1 3]);

    % Maximization
    for k = 1 : 3
        mu(k) = w(:,k)'*x / sum(w(:,k));
        sigma(k) = sqrt(w(:,k)'*((x-mu(k)).*(x-mu(k))) / sum(w(:,k)));
        phi(k) = sum(w(:,k)) / N;
    end
    mu_(t+1,:) = mu;
    sigma_(t+1,:) = sigma;
    phi_(t+1,:) = phi;
end
figure(1); subplot(2,2,2); plot(phi_); title('\phi');
figure(1); subplot(2,2,3); plot(mu_); title('\mu');
figure(1); subplot(2,2,4); plot(sigma_); title('\sigma');
發佈了35 篇原創文章 · 獲贊 36 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章