高斯混合模型(GMM)及其EM演算法的理解

阿拉丁吃米粉發表於2017-03-02

一個例子

高斯混合模型(Gaussian Mixed Model)指的是多個高斯分佈函式的線性組合,理論上GMM可以擬合出任意型別的分佈,通常用於解決同一集合下的資料包含多個不同的分佈的情況(或者是同一類分佈但引數不一樣,或者是不同型別的分佈,比如正態分佈和伯努利分佈)。

如圖1,圖中的點在我們看來明顯分成兩個聚類。這兩個聚類中的點分別通過兩個不同的正態分佈隨機生成而來。但是如果沒有GMM,那麼只能用一個的二維高斯分佈來描述圖1中的資料。圖1中的橢圓即為二倍標準差的正態分佈橢圓。這顯然不太合理,畢竟肉眼一看就覺得應該把它們分成兩類。

圖1
圖1

這時候就可以使用GMM了!如圖2,資料在平面上的空間分佈和圖1一樣,這時使用兩個二維高斯分佈來描述圖2中的資料,分別記為N(μ1,Σ1)\mathcal{N}(\boldsymbol{\mu}_1, \boldsymbol{\Sigma}_1)N(μ2,Σ2)\mathcal{N}(\boldsymbol{\mu}_2, \boldsymbol{\Sigma}_2). 圖中的兩個橢圓分別是這兩個高斯分佈的二倍標準差橢圓。可以看到使用兩個二維高斯分佈來描述圖中的資料顯然更合理。實際上圖中的兩個聚類的中的點是通過兩個不同的正態分佈隨機生成而來。如果將兩個二維高斯分佈N(μ1,Σ1)\mathcal{N}(\boldsymbol{\mu_1}, \boldsymbol{\Sigma}_1)N(μ2,Σ2)\mathcal{N}(\boldsymbol{\mu}_2, \boldsymbol{\Sigma}_2)合成一個二維的分佈,那麼就可以用合成後的分佈來描述圖2中的所有點。最直觀的方法就是對這兩個二維高斯分佈做線性組合,用線性組合後的分佈來描述整個集合中的資料。這就是高斯混合模型(GMM)。

圖2
圖2

高斯混合模型(GMM)

設有隨機變數X\boldsymbol{X},則混合高斯模型可以用下式表示:
p(x)=k=1KπkN(xμk,Σk)p(\boldsymbol{x}) = \sum_{k=1}^K\pi_k \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)

其中N(xμk,Σk)\mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)稱為混合模型中的第kk分量(component)。如前面圖2中的例子,有兩個聚類,可以用兩個二維高斯分佈來表示,那麼分量數K=2K = 2. πk\pi_k混合係數(mixture coefficient),且滿足:
k=1Kπk=1\sum_{k=1}^K\pi_k = 1
0πk10 \leq \pi_k \leq 1

實際上,可以認為πk\pi_k就是每個分量N(xμk,Σk)\mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)的權重。

GMM的應用

GMM常用於聚類。如果要從 GMM 的分佈中隨機地取一個點的話,實際上可以分為兩步:首先隨機地在這 K 個 Component 之中選一個,每個 Component 被選中的概率實際上就是它的係數πk\pi_k ,選中 Component 之後,再單獨地考慮從這個 Component 的分佈中選取一個點就可以了──這裡已經回到了普通的 Gaussian 分佈,轉化為已知的問題。

將GMM用於聚類時,假設資料服從混合高斯分佈(Mixture Gaussian Distribution),那麼只要根據資料推出 GMM 的概率分佈來就可以了;然後 GMM 的 K 個 Component 實際上對應KK個 cluster 。根據資料來推算概率密度通常被稱作 density estimation 。特別地,當我已知(或假定)概率密度函式的形式,而要估計其中的引數的過程被稱作『引數估計』。

例如圖2的例子,很明顯有兩個聚類,可以定義K=2K=2. 那麼對應的GMM形式如下:
p(x)=π1N(xμ1,Σ1)+π2N(xμ2,Σ2)p(\boldsymbol{x}) =\pi_1 \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_1, \boldsymbol{\Sigma}_1) + \pi_2 \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_2, \boldsymbol{\Sigma}_2)

上式中未知的引數有六個:(π1,μ1,Σ1;π2,μ2,Σ2)(\pi_1, \boldsymbol{\mu}_1, \boldsymbol{\Sigma}_1; \pi_2, \boldsymbol{\mu}_2, \boldsymbol{\Sigma}_2). 之前提到GMM聚類時分為兩步,第一步是隨機地在這KK個分量中選一個,每個分量被選中的概率即為混合係數πk\pi_k. 可以設定π1=π2=0.5\pi_1 = \pi_2 = 0.5,表示每個分量被選中的概率是0.5,即從中抽出一個點,這個點屬於第一類的概率和第二類的概率各佔一半。但實際應用中事先指定πk\pi_k的值是很笨的做法,當問題一般化後,會出現一個問題:當從圖2中的集合隨機選取一個點,怎麼知道這個點是來自N(xμ1,Σ1)N(\boldsymbol{x}|\boldsymbol{\mu}_1, \boldsymbol{\Sigma}_1)還是N(xμ2,Σ2)N(\boldsymbol{x}|\boldsymbol{\mu}_2, \boldsymbol{\Sigma}_2)呢?換言之怎麼根據資料自動確定π1\pi_1π2\pi_2的值?這就是GMM引數估計的問題。要解決這個問題,可以使用EM演算法。通過EM演算法,我們可以迭代計算出GMM中的引數:(πk,xk,Σk)(\pi_k, \boldsymbol{x}_k, \boldsymbol{\Sigma}_k).

GMM引數估計過程

GMM的貝葉斯理解

在介紹GMM引數估計之前,先改寫GMM的形式,改寫之後的GMM模型可以方便地使用EM估計引數。GMM的原始形式如下:

(1)p(x)=k=1KπkN(xμk,Σk)p(\boldsymbol{x}) = \sum_{k=1}^K\pi_k \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) \tag{1}

前面提到πk\pi_k可以看成是第kk類被選中的概率。我們引入一個新的KK維隨機變數z\boldsymbol{z}. zk(1kK)z_k (1 \leq k \leq K)只能取0或1兩個值;zk=1z_k = 1表示第kk類被選中的概率,即:p(zk=1)=πkp(z_k = 1) = \pi_k;如果zk=0z_k = 0表示第kk類沒有被選中的概率。更數學化一點,zkz_k要滿足以下兩個條件:
zk{0,1}z_k \in \{0,1\}
Kzk=1\sum_K z_k = 1

例如圖2中的例子,有兩類,則z\boldsymbol{z}的維數是2. 如果從第一類中取出一個點,則z=(1,0)\boldsymbol{z} = (1, 0);,如果從第二類中取出一個點,則z=(0,1)\boldsymbol{z} = (0, 1).

zk=1z_k=1的概率就是πk\pi_k,假設zkz_k之間是獨立同分布的(iid),我們可以寫出z\boldsymbol{z}的聯合概率分佈形式,就是連乘:

(2)p(z)=p(z1)p(z2)...p(zK)=k=1Kπkzkp(\boldsymbol{z}) = p(z_1) p(z_2)...p(z_K) = \prod_{k=1}^K \pi_k^{z_k} \tag{2}

因為zkz_k只能取0或1,且z\boldsymbol{z}中只能有一個zkz_k為1而其它zj(jk)z_j (j\neq k)全為0,所以上式是成立的。

圖2中的資料可以分為兩類,顯然,每一類中的資料都是服從正態分佈的。這個敘述可以用條件概率來表示:
p(xzk=1)=N(xμk,Σk)p(\boldsymbol{x}|z_k = 1) = \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)
即第kk類中的資料服從正態分佈。進而上式有可以寫成如下形式:
(3)p(xz)=k=1KN(xμk,Σk)zkp(\boldsymbol{x}| \boldsymbol{z}) = \prod_{k=1}^K \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)^{z_k} \tag{3}

上面分別給出了p(z)p(\boldsymbol{z})p(xz)p(\boldsymbol{x}| \boldsymbol{z})的形式,根據條件概率公式,可以求出p(x)p(\boldsymbol{x})的形式:

(4)p(x)=zp(z)p(xz)=z(k=1KπkzkN(xμk,Σk)zk)=k=1KπkN(xμk,Σk) \begin{aligned} p(\boldsymbol{x}) &= \sum_{\boldsymbol{z}} p(\boldsymbol{z}) p(\boldsymbol{x}| \boldsymbol{z}) \\ &= \sum_{\boldsymbol{z}} \left(\prod_{k=1}^K \pi_k^{z_k} \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)^{z_k} \right ) \\ &= \sum_{k=1}^K \pi_k \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) \end{aligned} \tag{4}

(注:上式第二個等號,對z\boldsymbol{z}求和,實際上就是k=1K\sum_{k=1}^K。又因為對某個kk,只要iki \ne k,則有zi=0z_i = 0,所以zk=0z_k=0的項為1,可省略,最終得到第三個等號)

可以看到GMM模型的(1)式與(4)式有一樣的形式,且(4)式中引入了一個新的變數z\boldsymbol{z},通常稱為隱含變數(latent variable)。對於圖2中的資料,『隱含』的意義是:我們知道資料可以分成兩類,但是隨機抽取一個資料點,我們不知道這個資料點屬於第一類還是第二類,它的歸屬我們觀察不到,因此引入一個隱含變數z\boldsymbol{z}來描述這個現象。

注意到在貝葉斯的思想下,p(z)p(\boldsymbol{z})是先驗概率, p(xz)p(\boldsymbol{x}| \boldsymbol{z})是似然概率,很自然我們會想到求出後驗概率p(zx)p(\boldsymbol{z}| \boldsymbol{x})
(5)γ(zk)=p(zk=1x)=p(zk=1)p(xzk=1)p(x,zk=1)=p(zk=1)p(xzk=1)j=1Kp(zj=1)p(xzj=1)=πkN(xμk,Σk)j=1KπjN(xμj,Σj) \begin{aligned} \gamma(z_k) &= p(z_k = 1| \boldsymbol{x}) \\ &= \frac{p(z_k = 1) p(\boldsymbol{x}|z_k = 1)}{p(\boldsymbol{x}, z_k = 1)} \\ &= \frac{p(z_k = 1) p(\boldsymbol{x}|z_k = 1)}{\sum_{j=1}^K p(z_j = 1) p(\boldsymbol{x}|z_j = 1)} \\ &= \frac{\pi_k \mathcal{N}(\boldsymbol{x|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k})}{\sum_{j=1}^K \pi_j \mathcal{N}(\boldsymbol{x|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j})} \end{aligned} \tag{5}

(第2行,貝葉斯定理。關於這一行的分母,很多人有疑問,應該是p(x,zk=1)p(\boldsymbol{x}, z_k = 1)還是p(x)p(\boldsymbol{x}),按照正常寫法,應該是p(x)p(\boldsymbol{x})。但是為了強調zkz_k的取值,有的書會寫成p(x,zk=1)p(\boldsymbol{x}, z_k = 1),比如李航的《統計學習方法》,這裡就約定p(x)p(\boldsymbol{x})p(x,zk=1)p(\boldsymbol{x}, z_k = 1)是等同的)
(第3行,全概率公式)
(最後一個等號,結合(3)(4))

上式中我們定義符號γ(zk)\gamma(z_k)來表示來表示第kk個分量的後驗概率。在貝葉斯的觀點下,πk\pi_k可視為zk=1z_k=1的先驗概率。

上述內容改寫了GMM的形式,並引入了隱含變數z\boldsymbol{z}和已知x{\boldsymbol{x}}後的的後驗概率γ(zk)\gamma(z_k),這樣做是為了方便使用EM演算法來估計GMM的引數。

EM演算法估計GMM引數

EM演算法(Expectation-Maximization algorithm)分兩步,第一步先求出要估計引數的粗略值,第二步使用第一步的值最大化似然函式。因此要先求出GMM的似然函式。

假設x={x1,x2,...,xN}\boldsymbol{x} = \{\boldsymbol{x}_1, \boldsymbol{x}_2, ..., \boldsymbol{x}_N\},對於圖2,x\boldsymbol{x}是圖中所有點(每個點有在二維平面上有兩個座標,是二維向量,因此x1,x2\boldsymbol{x}_1, \boldsymbol{x}_2等都用粗體表示)。GMM的概率模型如(1)式所示。GMM模型中有三個引數需要估計,分別是π\boldsymbol{\pi}μ\boldsymbol{\mu}Σ\boldsymbol{\Sigma}. 將(1)式稍微改寫一下:
(6)p(xπ,μ,Σ)=k=1KπkN(xμk,Σk)p(\boldsymbol{x}|\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \sum_{k=1}^K\pi_k \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) \tag{6}

為了估計這三個引數,需要分別求解出這三個引數的最大似然函式。先求解μk\mu_k的最大似然函式。樣本符合iid,(6)式所有樣本連乘得到最大似然函式,對(6)式取對數得到對數似然函式,然後再對μk\boldsymbol{\mu_k}求導並令導數為0即得到最大似然函式。
(7)0=n=1NπkN(xnμk,Σk)jπjN(xnμj,Σj)Σk(xnμk)0 = -\sum_{n=1}^N \frac{\pi_k \mathcal{N}(\boldsymbol{x}_n | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\sum_j \pi_j \mathcal{N}(\boldsymbol{x}_n|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)} \boldsymbol{\Sigma}_k (\boldsymbol{x}_n - \boldsymbol{\mu}_k) \tag{7}

注意到上式中分數的一項的形式正好是(5)式後驗概率的形式。兩邊同乘Σk1\boldsymbol{\Sigma}_k^{-1},重新整理可以得到:
(8)μk=1Nkn=1Nγ(znk)xn\boldsymbol{\mu}_k = \frac{1}{N_k}\sum_{n=1}^N \gamma(z_{nk}) \boldsymbol{x}_n \tag{8}

其中:
(9)Nk=n=1Nγ(znk)N_k = \sum_{n=1}^N \gamma(z_{nk}) \tag{9}

(8)式和(9)式中,NN表示點的數量。γ(znk)\gamma(z_{nk})表示點nnxn\boldsymbol{x}_n)屬於聚類kk的後驗概率。NkN_k可以表示屬於第kk個聚類的點的數量。那麼μk\boldsymbol{\mu}_k表示所有點的加權平均,每個點的權值是n=1Nγ(znk)\sum_{n=1}^N \gamma(z_{nk}),跟第kk個聚類有關。

同理求Σk\boldsymbol{\Sigma}_k的最大似然函式,可以得到:
(10)Σk=1Nkn=1Nγ(znk)(xnμk)(xnμk)T\boldsymbol{\Sigma}_k = \frac{1}{N_k} \sum_{n=1}^N \gamma(z_{nk}) (x_n - \boldsymbol{\mu}_k)(x_n - \boldsymbol{\mu}_k)^T \tag{10}

最後剩下πk\pi_k的最大似然函式。注意到πk\pi_k有限制條件k=1Kπk=1\sum_{k=1}^K\pi_k = 1,因此我們需要加入拉格朗日運算元:
lnp(xπ,μ,Σ)+λ(k=1Kπk1)\ln p(\boldsymbol{x}|\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma}) + \lambda(\sum_{k=1}^K \pi_k -1)

求上式關於πk\pi_k的最大似然函式,得到:
(11)0=n=1NN(xnμk,Σk)jπjN(xnμj,Σj)+λ0 = \sum_{n=1}^N \frac{\mathcal{N}(\boldsymbol{x}_n | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\sum_j \pi_j \mathcal{N}(\boldsymbol{x}_n|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)} + \lambda \tag{11}

上式兩邊同乘πk\pi_k,我們可以做如下推導:

(11.1)0=n=1NπkN(xnμk,Σk)jπjN(xnμj,Σj)+λπk0 = \sum_{n=1}^N \frac{\pi_k \mathcal{N}(\boldsymbol{x}_n | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\sum_j \pi_j \mathcal{N}(\boldsymbol{x}_n|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)} + \lambda \pi_k \tag{11.1}

結合公式(5)、(9),可以將上式改寫成:

(11.2)0=Nk+λπk0 = N_k + \lambda \pi_k \tag{11.2}

注意到k=1Kπk=1\sum_{k=1}^K \pi_k = 1,上式兩邊同時對kk求和。此外NkN_k表示屬於第個聚類的點的數量(公式(9))。對NkN_k,k=1k=1k=Kk=K求和後,就是所有點的數量NN:

(11.3)0=k=1KNk+λk=1Kπk0 = \sum_{k=1}^K N_k + \lambda \sum_{k=1}^K \pi_k \tag{11.3}

(11.4)0=N+λ0 = N + \lambda \tag{11.4}

從而可得到λ=N\lambda = -N,帶入(11.2),進而可以得到πk\pi_k更簡潔的表示式:
(12)πk=NkN\pi_k = \frac{N_k}{N} \tag{12}

EM演算法估計GMM引數即最大化(8),(10)和(12)。需要用到(5),(8),(10)和(12)四個公式。我們先指定π\boldsymbol{\pi}μ\boldsymbol{\mu}Σ\boldsymbol{\Sigma}的初始值,帶入(5)中計算出γ(znk)\gamma(z_{nk}),然後再將γ(znk)\gamma(z_{nk})帶入(8),(10)和(12),求得πk\pi_kμk\boldsymbol{\mu}_kΣk\boldsymbol{\Sigma}_k;接著用求得的πk\pi_kμk\boldsymbol{\mu}_kΣk\boldsymbol{\Sigma}_k再帶入(5)得到新的γ(znk)\gamma(z_{nk}),再將更新後的γ(znk)\gamma(z_{nk})帶入(8),(10)和(12),如此往復,直到演算法收斂。

EM演算法

  1. 定義分量數目KK,對每個分量kk設定πk\pi_kμk\boldsymbol{\mu}_kΣk\boldsymbol{\Sigma}_k的初始值,然後計算(6)式的對數似然函式。
  2. E step
    根據當前的πk\pi_kμk\boldsymbol{\mu}_kΣk\boldsymbol{\Sigma}_k計算後驗概率γ(znk)\gamma(z_{nk})
    γ(znk)=πkN(xnμn,Σn)j=1KπjN(xnμj,Σj)\gamma(z_{nk}) = \frac{\pi_k\mathcal{N}(\boldsymbol{x}_n| \boldsymbol{\mu}_n, \boldsymbol{\Sigma}_n)}{\sum_{j=1}^K \pi_j \mathcal{N}(\boldsymbol{x}_n| \boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)}
  3. M step
    根據E step中計算的γ(znk)\gamma(z_{nk})再計算新的πk\pi_kμk\boldsymbol{\mu}_kΣk\boldsymbol{\Sigma}_k
    μknew=1Nkn=1Nγ(znk)xnΣknew=1Nkn=1Nγ(znk)(xnμknew)(xnμknew)Tπknew=NkN \begin{aligned} \boldsymbol{\mu}_k^{new} &= \frac{1}{N_k} \sum_{n=1}^N \gamma(z_{nk}) \boldsymbol{x}_n \\ \boldsymbol{\Sigma}_k^{new} &= \frac{1}{N_k} \sum_{n=1}^N \gamma(z_{nk}) (\boldsymbol{x}_n - \boldsymbol{\mu}_k^{new}) (\boldsymbol{x}_n - \boldsymbol{\mu}_k^{new})^T \\ \pi_k^{new} &= \frac{N_k}{N} \end{aligned}
    其中:
    Nk=n=1Nγ(znk)N_k = \sum_{n=1}^N \gamma(z_{nk})
  4. 計算(6)式的對數似然函式
    lnp(xπ,μ,Σ)=n=1Nln{k=1KπkN(xkμk,Σk)}\ln p(\boldsymbol{x}|\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \sum_{n=1}^N \ln \left\{\sum_{k=1}^K \pi_k \mathcal{N}(\boldsymbol{x}_k| \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)\right\}
  5. 檢查引數是否收斂或對數似然函式是否收斂,若不收斂,則返回第2步。

Reference

  1. 漫談 Clustering (3): Gaussian Mixture Model
  2. Draw Gaussian distribution ellipse
  3. Pang-Ning Tan 等, 資料探勘導論(英文版), 機械工業出版社, 2010
  4. Christopher M. Bishop etc., Pattern Recognition and Machine Learning, Springer, 2006
  5. 李航, 統計學習方法, 清華大學出版社, 2012

相關文章