本文整理自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 ,每個xi∈Rn ,沒有類別標籤y 。
K-means算法是將樣本聚類成K 個簇(cluster),具體算法描述如下:
1、隨機選取K 個聚類質心點爲{μk}Kk=1,μk∈Rn 。
2、重複下面過程直到收斂{
對於每一個樣例i ,計算其應該屬於的類
zi=argminj||xi−μj||2
對於每一個類j ,重新計算該類的質心
μj=∑Ni=11{zi=j}xi∑Ni=11{zi=j}
}
其中,K 是事先給定的聚類數,zi∈1,2,..,K 代表樣例i 與K 個類中距離最近的那個類,μ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 ,但是怎麼知道假定的對不對呢?怎麼評價假定的好不好呢?在此,可以使用樣本的極大似然估計來度量,即
x 和
y 的聯合分佈
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 是定義域爲實數的函數,如果對於所有的實數X ,f′′(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=1Nlog∑zip(xi,zi;θ)
該式直接求
θ 一般比較困難,因爲有隱藏變量
z 存在,但是一般確定了
z 後,求解就容易了。
EM是一種解決存在隱含變量優化問題的有效方法。既然不能直接最大化
L(θ) ,那麼就不斷地建立
L(θ) 的下界(E步),然後優化下界(M步)。即對於每一個樣例
i ,讓
Q(zi) 表示該樣例隱含變量
zi 的某種分佈,且
∑ziQ(zi)=1 ,
Q(zi)≥0 。由Jensen不等式得:
L(θ)=∑i=1Nlog∑zip(xi,zi;θ)=∑i=1Nlog∑ziQ(zi)p(xi,zi;θ)Q(zi)≥∑i=1N∑ziQ(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=1N∑ziQ(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=1N∑ziQt(zi)logp(xi,zi;θt)Qt(zi)
固定
Qt(zi) ,M步:
將
θt 視作變量,對
L(θt) 求導等於零可得到
θt+1 ,則下式成立:
L(θt)=∑i=1N∑ziQt(zi)logp(xi,zi;θt)Qt(zi)≤∑i=1N∑ziQt(zi)logp(xi,zi;θt+1)Qt(zi)≤∑i=1N∑ziQt+1(zi)logp(xi,zi;θt+1)Qt+1(zi)=L(θt+1)
證畢。
如果定義
J(Q,θ)=∑i=1N∑ziQ(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} 滿足多項式分佈zi∼M(ϕ) ,其中p(zi=j)=ϕj ,ϕj≥0 ,∑Kj=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(ϕ,μ,σ)=log∏i=1Np(xi;ϕ,μ,σ)=∑i=1Nlogp(xi;ϕ,μ,σ)=∑i=1Nlog∑zi=1Kp(xi,zi;ϕ,μ,σ)=∑i=1Nlog∑zi=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)⋅ϕj∑k=1K12π√σkexp(−(xi−μk)22σ2k)⋅ϕk
即每個樣例xi 的隱含類別zi 爲j 的概率可以通過後驗概率計算得到。對比K-means發現,每個樣例分配的類別zi 是有一定的概率的,每個樣例i 都要計算屬於每一個類別j 的概率。
M步:固定wi(j) ,最大化
J(θ)=∑i=1N∑ziQ(zi)logp(xi,zi;θ)Q(zi)=∑i=1N∑j=1KQ(zi=j)logp(xi,zi;θ)Q(zi=j)=∑i=1N∑j=1Kwi(j)log12π√σjexp(−(xi−μj)22σ2j)⋅ϕjwi(j)
求參數θ=(ϕj,μj,σj) 。
對μj,σj 求導,得
∂J(θ)∂μj=∂∂μj⎛⎝∑i=1N∑j=1Kwi(j)⎡⎣log1wi(j)+log12π−−√σj−(xi−μj)22σ2j+logϕj⎤⎦⎞⎠=∑i=1Nwi(j)[1σ2j(μj−xi)μj]
∂J(θ)∂σj=∂∂σj⎛⎝∑i=1N∑j=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)xi∑Ni=1wi(j)σ2j=∑Ni=1wi(j)(xi−μj)2∑Ni=1wi(j)
同時,由於
ϕj≥0 ,且
∑Kj=1ϕj=1 ,故建立拉格朗日函數
L(ϕj)=∑i=1Nwi(j)logϕj+β(∑Kj=1ϕj−1)
其中,
ϕj 相關的常數被省略了。對
ϕj 求導等於0,結合
∑Kj=1ϕj=1 可解得:
β=−∑i=1Nwi(j)ϕj=−∑j=1K∑i=1Nwi(j)∑j=1Kϕj=−∑i=1N∑j=1Kwi(j)=−∑i=1N1=−N
即:
ϕj=1N∑i=1Nwi(j)
算法過程如下:
循環下面步驟,直到收斂:{
(E步)對於每一個i 和j 計算
wi(j)=12π√σjexp(−(xi−μj)22σ2j)⋅ϕj∑k=1K12π√σkexp(−(xi−μk)22σ2k)⋅ϕk
(M步),更新參數:
ϕj=1N∑i=1Nwi(j)μj=∑Ni=1wi(j)xi∑Ni=1wi(j)σ2j=∑Ni=1wi(j)(xi−μj)2∑Ni=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
for k = 1 : 3
w(:,k) = phi(k)*normpdf(x,mu(k),sigma(k));
end
w = w./repmat(sum(w,2),[1 3]);
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');