天天看點

高斯混合模型GMM的C++實作

高斯密度函數估計是一種參數化模型。有單高斯模型(Single Gaussian Model, SGM)和高斯混合模型(Gaussian mixture model,GMM)兩類。類似于聚類,根據高斯機率密度函數(PDF,見公式1)參數的不同,每一個高斯模型可以看作一種類别,輸入一個樣本x,即可通過PDF計算其值,然後通過一個門檻值來判斷該樣本是否屬于高斯模型。很明顯,SGM适合于僅有兩類别問題的劃分,而GMM由于具有多個模型,劃分更為精細,适用于多類别的劃分,可以應用于複雜對象模組化。

多元變量X服從高斯分布時,它的機率密度函數PDF為:

高斯混合模型GMM的C++實作

x是次元為d的列向量,u是模型期望,Σ是模型方差。在實際應用中u通常用樣本均值來代替,Σ通常用樣本方差來代替。很容易判斷一個樣x本是否屬于類别C。因為每個類别都有自己的u和Σ,把x代入(1)式,當機率大于一定門檻值時我們就認為x屬于C類。

從幾何上講,單高斯分布模型在二維空間應該近似于橢圓,在三維空間上近似于橢球。遺憾的是在很多分類問題中,屬于同一類别的樣本點并不滿足“橢圓”分布的特性。這就引入了高斯混合模型。

高斯混合模型是單一高斯機率密度函數的延伸,由于 GMM 能夠平滑地近似任意形狀的密度分布,是以近年來常被用在語音、圖像識别等方面,得到不錯的效果。

GMM認為資料是從幾個SGM中生成出來的,即

高斯混合模型GMM的C++實作

K需要事先确定好,就像K-means中的K一樣。πk是權值因子。其中的任意一個高斯分布N(x;uk,Σk)叫作這個模型的一個component。這裡有個問題,為什麼我們要假設資料是由若幹個高斯分布組合而成的,而不假設是其他分布呢?實際上不管是什麼分布,隻K取得足夠大,這個XX Mixture Model就會變得足夠複雜,就可以用來逼近任意連續的機率密度分布,隻是因為高斯函數具有良好的計算性能,所GMM被廣泛地應用。

GMM是一種聚類算法,每個component就是一個聚類中心。即在隻有樣本點,不知道樣本分類(含有隐含變量)的情況下,計算出模型參數(π,u和Σ),這可以用EM算法來求解。再用訓練好的模型去差别樣本所屬的分類,方法是:step1随機選擇K個component中的一個(被選中的機率是πk);step2把樣本代入剛選好的component,判斷是否屬于這個類别,如果不屬于則回到step1。

當每個樣本所屬分類已知時,GMM的參數非常好确定,直接利用Maximum Likelihood。設樣本容量為N,屬于K個分類的樣本數量分别是N1,N2,...,Nk,屬于第k個分類的樣本集合是L(k)。

高斯混合模型GMM的C++實作
高斯混合模型GMM的C++實作
高斯混合模型GMM的C++實作

有N個資料點,服從某種分布Pr(x;θ),我們想找到一組參數θ,使得生成這些資料點的機率最大,這個機率就是

高斯混合模型GMM的C++實作

稱為似然函數(Lilelihood Function)。通常單個點的機率很小,連乘之後資料會更小,容易造成浮點數下溢,是以一般取其對數,變成

高斯混合模型GMM的C++實作

稱為log-likelihood function。

GMM的log-likelihood function就是:

高斯混合模型GMM的C++實作

這裡每個樣本xi所屬的類别zk是不知道的。Z是隐含變量。

我們就是要找到最佳的模型參數,使得(6)式所示的期望最大,“期望最大化算法”名字由此而來。

1)初始值:

方案1:協方差矩陣Σk設為機關矩陣,每個模型比例的先驗機率πk=1/N,均值uk設為随機數。

方案2:由k均值(k-means)聚類算法對樣本進行聚類,利用各類的均值作為uk,并計算Σk,πk取各類樣本占樣本總數的比例。

2)EM算法:

E-Step E就是Expectation的意思,就是假設模型參數已知的情況下求隐含變量Z分别取z1,z2,...的期望,亦即Z分别取z1,z2,...的機率。在GMM中就是求資料點由各個 component生成的機率。

高斯混合模型GMM的C++實作

注意到我們在Z的後驗機率前面乘以了一個權值因子αk,它表示在訓練集中資料點屬于類别zk的頻率,在GMM中它就是πk。

高斯混合模型GMM的C++實作

M-Step M就是Maximization的意思,就是用最大似然的方法求出模型參數。現在我們認為上一步求出的r(i,k)就是“資料點xi由component k生成的機率”。根據公式(3),(4),(5)可以推出均值、協方差和權值的更新公式為:

高斯混合模型GMM的C++實作
高斯混合模型GMM的C++實作
高斯混合模型GMM的C++實作
高斯混合模型GMM的C++實作

3)收斂條件:

不斷地疊代E和M步驟,重複更新上面的三個值,直到參數的變化不顯著。

代碼來自網絡,做了簡單的測試。

    本文轉自阿凡盧部落格園部落格,原文連結:http://www.cnblogs.com/luxiaoxun/archive/2013/05/10/3071672.html,如需轉載請自行聯系原作者

繼續閱讀