之前在學習中遇到高斯混合模型,卡了很長一段時間,在這里記下學習中的一些問題以及解決的方法。希望看到這篇文章的同學們對高斯混合模型能有一些基本的概念。全文不廢話,直接上重點。
本文將從以下三個問題詳解高斯混合模型:
1.什么是高斯混合模型?
2.高斯混合模型的數學原理?
3.高斯混合模型在MATLAB中如何使用?
一、什么是高斯混合模型?
高斯混合模型,英文全稱:Gaussian mixture model,簡稱GMM。高斯混合模型就是用高斯概率密度函數(二維時也稱為:正態分布曲線)精確的量化事物,將一個事物分解為若干基於高斯概率密度函數行程的模型。這句話看起來有些深奧,這樣去理解,事物的數學表現形式就是曲線,其意思就是任何一個曲線,無論多么復雜,我們都可以用若干個高斯曲線來無限逼近它,這就是高斯混合模型的基本思想。那么下圖(圖1.1)表示的就是這樣的一個思想。
題外話:又由於高斯函數只要在樣本數據點足夠大時,可以表征任何一種事物的規律。在信號處理中常用高斯函數來代替沖擊函數,用沖擊函數的組合重構原始信號。所以用GMM表達任何曲線是可行的。(可能你不知道我這段話在說什么,沒關系,這里只是用一個信號重構的實例來說明GMM的可行性)
好,我們繼續,對於圖1.1,換一種方式理解,曲線是模擬一組數據的結果,而這些數據分布情況如圖1.2所示。那么此時GMM模擬出的曲線就有了現實的意義,這時就可以用構造好的GMM模型來表達這些數據,相比於存儲數據,使用GMM中的參數來表達數據要方便簡單的多,並且是數學上有完整的表達式。
反過來思考,假如先拿到的是圖1.2,知道了數據的分布情況。如何用曲線和數學表達式來逼近模擬它呢?答:用高斯混合模型來做,做出來的結果如圖1.1所示,圖1.1中上方的曲線是由若干個高斯函數疊加而成的。以上就是高斯混合模型的基本概念。
增加數據維度,得到更為復雜一點的結果如圖1.3所示,這也是我們經常看到GMM情況。
題外話:高斯混合模型也被視為一種聚類方法,是機器學習中對“無標簽數據”進行訓練得到的分類結果。其分類結果由概率表示,概率大者,則認為屬於這一類。
二、高斯混合模型的數學原理
在二維的情況下,理解起來很簡單,如圖1.1表示的那樣,一個復雜的曲線可以用若干個組合起來的高斯函數來逼近。
在三維的情況下,同樣的理解:任何一個曲面都可以用高斯函數來逼近。
在N維的情況下,任何一個模型都可以用高斯函數來逼近。(當然,這里用到的“高斯函數”的維度是跟着數據的變化而變化的)。好,這里重新復習了一下GMM的概念。數學原理我們從最簡單的二維開始來理解,由淺入深。
2.1 二維高斯函數
二維高斯函數的表達式、圖形以及似然估計中的3sigma原則,都在圖中列出,碼字不易,PPT也是自己做的,為了保護版權,添加了水印,如有疑問,可以聯系圖中QQ在線交流。
2.2 三維高斯函數
三維高斯函數函數的數學表達式以及其中字母代表的含義,在圖2.2中給出。
由圖2.2中的公式,進行繪圖,得到如圖2.3所示的結果。
(對於圖2.3,解釋一下,當時理解上出了一點小問題,把圖中的二維都視為三維就好了,不影響。)
這里對圖2.2和圖2.3進行說明,u1和u2是均值,均值u的物理意義就是高斯混合模型的中心,這個中心可以表示為(u1,u2),標准差sigma決定高斯函數的形狀,這和二維情況是一樣的。在圖2.3中下方兩個圖可以看到,從某一個二維坐標系來看,三維高斯函數可以簡化為二維高斯函數。協方差rou表示的是數據的相關性。
2.3 N維高斯函數
N維高斯函數數學表達式由圖2.4給出,其協方差的概念由圖2.5給出。
理解了三維高斯函數中各個參數的物理意義,在N維上面理解起來也就簡單了。對於N維高斯函數,其數據的維度也是N維的,此時均值向量u是由N個均值u1,u2,...un組成的,其物理意義仍然是高斯函數的中心,協方差矩陣大sigma依舊表示的是高斯函數的形狀,此時的大sigma是N行N列的矩陣,是如圖2.5所示的由各個數據的協方差組成的矩陣。
好了,終於了解完一般高斯函數的形式,接下來要進入正題GMM了。
2.4 高斯混合模型的數學原理
前面我們首先了解了高斯混合模型是什么:用高斯函數近似表示曲線或者曲面。然后鋪墊了部分數學基礎:從二維到N維高斯函數的表達式及其參數的物理意義。下面由圖2.6給出高斯混合模型的數學表達式
看到這個表達式是不是很高興,沒有想象中那么難,很簡單的一行。這里說明一下:
(1)X是隨機變量,可以理解為維度不定向量,X的維度決定了g(x)的維度,g(x)是單一高斯函數,也就是N維的高斯函數,其中N可以為任意整數,N由X的維度決定。
(2)回到之前的那個問題,用若干個高斯函數近似一個曲線或者曲面,無論這個曲線或者曲面是簡單或復雜。要想實現近似,需要確定用多少個高斯函數來近似,這個高斯函數的個數用K表示,K的意義就是:GMM中單一高斯函數的個數。再專業一點,稱K為GMM中成分的個數,其中成分指的就是單一高斯函數。【成分這個詞在GMM中的由來是因為MATLAB中將GMM中高斯函數個數用“ComponentProportion”來表示,譯為“成分”】
(3)混合權重中:每個單一高斯函數在GMM中所起的作用是不一樣的,混合權重在決定了單一高斯函數在GMM中起的作用,可以聯想本文中圖1.1,擬合這條曲線的每個高斯函數的高度都是不一樣的。
(4)維度的問題,這個比較好理解。維度就是隨機變量X的維度,也就是單一高斯函數g(x)的維度,主要是由隨機變量X的維度決定的。當一個高斯混合模型維數為N、成分為K時,我們稱之為:K個成分N階的高斯混合模型。
了解了以上概念之后,要確定一個高斯混合混合模型,要怎么做呢?關鍵是確定圖2.6中的參數,如何確定?這里要用到EM算法【EM算法,指的是最大期望算法(Expectation Maximization Algorithm,又譯期望最大化算法),是一種迭代算法,在統計學中被用於尋找,依賴於不可觀察的隱性變量的概率模型中,參數的最大似然估計。】
三、高斯混合模型在MATLAB中的使用
在較新的MATLAB版本中,我用的是MATLAB2015A,此版本將關於高斯混合模型內容都集中在一個叫做:gmdistribution的類中。可以在MATLAB中輸入:help gmdistribution,查看這個類的詳細介紹和幫助文檔。下面是對這個類簡單的介紹。
gmdistribution類的介紹:
gmdistribution對象存儲高斯混合分布, 也稱為高斯混合模型 (GMM), 它是由多元高斯分布分量組成的多變量分布。每個分量由其平均值和協方差定義, 混合物由混合比例向量定義。
創造:可以通過兩種方式創建gmdistribution模型對象。使用gmdistribution函數 (此處描述) 通過指定分布參數來創建gmdistribution模型對象。使用 fitgmdist 函數可以將gmdistribution模型對象與給定固定數量的組件的數據相匹配。
使用方法:
gm = gmdistribution(mu,sigma)
gm = gmdistribution(mu,sigma,p)
例子:gm = gmdistribution(mu,sigma) 創建一個gmdistribution模型對象使用指定的手段mu和方差sigma以相等的混合的比例。
gm = gmdistribution(mu,sigma,p) 指定多變量高斯分布分量的混合比例。
以上是使用指定的均值和方差構造高斯混合模型類,也就是根據給定的參數得到數據。然而我們常用的是根據數據的分布求得這些參數:均值、協方差、混合權重等,這時就要用到上文提到的fitgmdist函數了。【fitgmdist函數,只有在最新版本里才這么用,之前的版本稱為:gmdistribution.fit,當然其在MATLAB里調用方式也不一樣】
在MATLAB中輸入:hlep gmdistribution,或者輸入:help fitgmdist函數可以查看此函數的幫助文檔,並且幫助文檔中會給出部分例子。下面為對這個函數的介紹:
gmdistribution.fit(高斯混合參數估計)
注意
fit
將被刪除在未來的版本。改用 fitgmdist
。(MATLAB的幫助文檔很溫馨,特意指出了這個函數在未來的版本可能會被刪除,並且給出了修改使用的建議)
語法
obj= gmdistribution.fit(X,k)obj=gmdistribution.fit(...,
param1
,val1
,param2
,val2
,...)
描述
obj = gmdistribution.fit(X,k)
使用期望最大化 (EM) 算法構造包含最大似然的 gmdistribution
類的對象obj
高斯混合模型中的參數的估計與k
分量的數據在n-m矩陣X
, 其中n是觀察的數量和m是數據的維度。gmdistribution
將NaN
值視為缺少的數據。包含NaN
值的X
行被排除在合適的范圍內。
obj = gmdistribution.fit(...,
提供對迭代 EM 算法的控制。由於博客排版會亂,下面截圖表示,圖3.1為gmdistribution.fit函數的參數及其意義。看不清沒關系,可以在MATLAB幫助文檔里查找到。param1
,val1
,param2
,val2
,...)
在某些情況下, gmdistribution可能收斂到一個或多個元件具有病態或奇異協方差矩陣的解。
下面的問題可能導致病態的協方差矩陣:
(1)數據的維數相對較高, 沒有足夠的觀測。
(2)數據的某些功能 (變量) 是高度相關的。
(3)部分或全部功能是離散的。
(4)您試圖將數據與太多組件相匹配。
通常, 通過使用下列預防措施之一, 可以避免獲得病態的協方差矩陣:
(1)預處理數據以刪除相關功能。
(2)將'SharedCov'設置為true可對每個組件使用相等的協方差矩陣。
(3)將'CovType' " 設置為'diagonal'.
(4)使用'Regularize'將一個非常小的正數添加到每個協方差矩陣的對角線上。
(5)請嘗試另一組初始值。
在其他情況下, gmdistribution可能通過中間步驟, 其中一個或多個組件具有病態的協方差矩陣。嘗試另一組初始值可能會避免此問題, 而不會更改數據或模型。
仔細看的話,會發現MATLAB幫助文檔真的很給力,不僅給出了一系列的溫馨提示,而且預知了一些在使用會遇到的問題以及如何去解決。比如上面給出導致協方差矩陣病態的原因以及怎么預防。
當然,使用新版本的我們要使用的函數是fitgmdist。來看一下這個函數:
fitgmdist(擬合高斯混合模型數據)
語法
GMModel = fitgmdist(X,k)
GMModel = fitgmdist(X,k,Name,Value)
描述
例子
= fitgmdist(X,GMModel
k
) 返回一個高斯混合分布模型 (GMModel
), 其中k個成分適合數據 (X
).
例子
= fitgmdist(X,GMModel
k
,Name,Value
) 返回一個具有指定附加選項的高斯混合分布模型由一個或多個Name,Value
對參數。例如, 可以指定正則值或協方差類型。
這里注意:雖然給出了兩種函數,但是其使用方法都是一樣的。使用起來也很簡單,給出了兩種調用方式,一種是簡單的只要給定輸入的隨機變量,成分個數。另一種是可以指定具體參數如:協方差矩陣是否為對角等。
我們來運行一下MATLAB幫助文檔給出的例子,看一看得到的結果里是什么情況。例子如圖3.2所示,是MATLAB幫助文檔給出的一個簡單使用。
圖可能看不清,代碼再次列出(代碼換了一種顏色,以免混淆):
mu1 = [1 2];
Sigma1 = [2 0; 0 0.5];
mu2 = [-3 -5];
Sigma2 = [1 0;0 1];
rng(1); % For reproducibility
X = [mvnrnd(mu1,Sigma1,1000);mvnrnd(mu2,Sigma2,1000)];
%適合高斯混合模型。指定有兩個組件。
GMModel = fitgmdist(X,2);
%在擬合的高斯混合模型輪廓上繪制數據。
figure
y = [zeros(1000,1);ones(1000,1)];
h = gscatter(X(:,1),X(:,2),y);
hold on
ezcontour(@(x1,x2)pdf(GMModel,[x1 x2]),get(gca,{'XLim','YLim'}))
title('{\bf Scatter Plot and Fitted Gaussian Mixture Contours}')
legend(h,'Model 0','Model1')
hold off
將以上這段代碼復制到MATLAB中運行,我們就成功使用了一次高斯混合模型,那么得到的結果圖是什么意思呢。先來看下結果圖3.3
這個圖的表達的是,有兩堆數據,可以用2個成分的高斯混合模型來描述。當然也可以用3個成分的或者4個成分或者任意自己想用的成分來描述,這里可以自己嘗試,只要修改fitgmdist(X,K)中K的值就可以了。結果圖是得到了,那么擬合后我們得到了什么呢?由於程序中這一句GMModel = fitgmdist(X,2);把結果存在GMModel變量中,可以在MATLAB工作區中查看GMModel。查看GMModel中的內容見圖3.4。
由圖可知,GMModel是gmdistribution類的一個數據,其中包含了許多類成員:如成分個數、分部名稱、均值向量、協方差矩陣、協方差矩陣類型、是否正則化等等,具體列出關於確定這個高斯混合模型的所有參數以及參數的內容。
看到這里,恭喜你終於看完了高斯混合模型,是否對高斯混合模型有了初步的概念呢,如果還沒有的話,可以把文檔多看幾遍、里面的代碼自己敲一敲、函數的幫助文檔自己查看一番。如果還有疑問,可以加圖片水印中的QQ與我交流。【由於博文訪問量變大,QQ消息也越來越多,有疑問的小伙伴可以整理好問題,發到我的郵箱:1140780455@qq.com,我看到后會逐一回復。】
一個例子回顧總結高斯混合模型
最后,用一個例子回顧並且總結一下高斯混合模型:
米飯的例子
最后用一個例子來總結一下我們今天一起學習的高斯混合模型,這個例子是我在食堂吃飯的時候突然想起的。
假如現在在食堂吃飯,找了張桌子,我打了一碗飯,往這里一坐,碗放在桌上。以俯視的角度從上往下看,此時把桌子看做坐標軸,米飯為數據點,這是在二維平面上,那么數據點是由二維坐標確定的。那么碗就可以看做GMM模型二維聚類俯視圖的圈,聚類的中心點自然就是在碗里。此時的桌子、碗、米飯組成的整體,就可以稱之為二維平面上的一成分高斯混合模型。
這個時候,突然來了個同學,也正好端着一碗米飯,在我對面坐下了,也把碗往桌上這么一放。此時平面上就有兩堆數據點了,這就可以看做是兩個成分的高斯混合模型。此時的桌子、碗、米飯組成的整體,就可以稱之為二維平面上的二成分高斯混合模型。如果這個時候,我發現桌上有一粒米飯,我就想啊,這粒米飯到時是你碗里的呢,還是我碗里的呢,誒,這時就需要用到高斯混合模型估計了。步驟如下:1.根據兩堆數據點確定高斯混合模型的參數均值向量和協方差矩陣,確定參數可以使用EM期望最大算法;這里最終得到描述兩碗米飯的兩個GMM。2.將桌上的這粒米飯以二維坐標表示,輸入到我們計算好的兩個高斯混合模型。得出在每個GMM下概率,一般情況下,哪個概率大,就認為屬於哪一堆數據。一般的看來,會認為,這里米飯離誰近就是誰的,沒錯確實是這樣。但是也有這樣的可能,米飯是離我比較近,但是我打的是三毛的米飯,而你打的是兩塊的米飯,我的少,你的多,這個時候就不一定了,那么這就關系到GMM權重的設置了。
同樣的,把食堂看做一個平面,把一個桌子上的碗裝着的米飯,看做一堆數據。假設食堂有N張桌子,那么就有N堆數據,這時如果地上有一粒米飯,就需要對這N堆數據建模,然后根據此米飯的坐標確定大概是屬於哪張桌子掉下來的。那么此時的模型就成為二維N成分高斯混合模型。
類似的,假設描述每粒米飯的參數不止是2個信息,還有其他像重量啊、米飯多長、多寬等N個參數,那么再來對剛剛講的數據進行建模,此時就是N維空間中N個成分的高斯混合模型了。
以上我們假設碗是圓的,也就是高斯模型的協方差矩陣是對角化后的;假設用的是橢圓的盤子,橢圓時盤子不同的擺法就不一樣了,情況復雜很多,此時就是協方差矩陣沒對角化的情況。為什么呢,之前介紹過,因為任何一個非奇異矩陣,都可以對他進行分解,分解為一個對角陣乘以一個一般矩陣,這就是矩陣的奇異值分解,此時這個一般矩陣又可以稱為旋轉因子,因為圖像的旋轉幾何運算都可以用矩陣的乘法來表示,換句話說,一副二維平面上的圖像乘以一個矩陣,可以看做是把這個圖形進行旋轉了,最大奇異值對應的右特征向量是偏離原點最歷害的方向。這只是針對這一種情況,當然還有平移因子,縮放因子等等,不同的變換因子矩陣形式是不一樣的。
最后的最后,總結一下本篇博文遺留下來的問題:
1.高斯混合模型是否為全局最優?
2.如果數據不充分高斯混合模型的使用意義在哪?
3.面對維數災難時,高斯混合模型該何去何從?
這些問題我也還沒有弄清楚,歡迎大家一起討論。
---摘自《許濤文集 學習筆記》