達觀數據:一文詳解高斯混合模型原理
本文用生動的案例對高斯混合模型原理進行了通俗易懂的講解,并分析了高斯混合模型與另一種常見聚類算法K-means的關系。
什么是高斯混合模型(Gaussian Mixture Model)
高斯混合模型(Gaussian Mixture Model)通常簡稱GMM是一種業界廣泛使用的聚類算法,該方法使用了高斯分布作為參數模型,并使用了期望***(Expectation Maximization,簡稱EM)算法進行訓練。本文對該方法的原理進行了通俗易懂的講解,期望對讀者更直觀的理解方法原理有幫助。文本的***還分析了高斯混合模型了另一種常見聚類算法K-means的關系,實際上在特定約束條件下,K-means算法可以被看作是高斯混合模型(GMM)的一種特殊形式。
1. 什么是高斯分布?
高斯分布(Gaussian distribution)有時也被稱為正態分布(normal distribution),是一種在自然界大量存在的、最為常見的分布形式,在提供精確數學定義前,先用一個簡單的例子來說明。
如果我們對大量的人口進行身高數據的隨機采樣,并且將采得的身高數據畫成柱狀圖,將會得到如下圖1所示的圖形。這張圖模擬展示了334個成人的統計數據,可以看出圖中最多出現的身高在180cm左右2.5cm的區間里。
圖1:由334個人的身高數據構成的正態分布直方圖
這個圖形非常直觀的展示了高斯分布的形態。接下來看下嚴格的高斯公式定義,高斯分布的概率密度函數公式如下:
公式中包含兩個參數,參數μ表示均值,參數σ表示標準差,均值對應正態分布的中間位置,在本例中我們可以推測均值在180cm附近。標準差衡量了數據圍繞均值分散的程度。
學過大學高數的同學應該還記得,正態分布的一個背景知識點是,95%的數據分布在均值周圍2個標準差的范圍內。本例中大約20到30左右是標準差參數的取值,因為大多數數據都分布在120cm到240cm之間。
上面的公式是概率密度函數,也就是在已知參數的情況下,輸入變量指x,可以獲得相對應的概率密度。還要注意一件事,就是在實際使用前,概率分布要先進行歸一化,也就是說曲線下面的面積之和需要為1,這樣才能確保返回的概率密度在允許的取值范圍內。
如果需要計算指定區間內的分布概率,則可以計算在區間首尾兩個取值之間的面積的大小。另外除了直接計算面積,還可以用更簡便的方法來獲得同樣的結果,就是減去區間x對應的累積密度函數(cumulative density function,CDF)。因為CDF表示的是數值小于等于x的分布概率。
現在我們回到之前的例子來評估下參數和對應的實際數據。假設我們用柱狀線來表示分布概率,每個柱狀線指相應身高值在334個人中的分布概率,用每個身高值對應的人數除以總數(334)就可以得到對應概率值,圖2用左側的紅色線(Sample Probability)來表示。
如果我們設置參數μ=180,σ=28,使用累積密度函數來計算對應的概率值——右側綠色線(Model Probability),可以肉眼觀察到模型擬合的精度。
圖2
圖2:對給定用戶,身高分布的采樣概率用紅色柱狀圖表示,高斯模型在參數μ=180,σ=28時計算出的概率用綠色柱狀圖表示
觀察圖2可以看出,剛才咱們猜測的均值參數180和標準差參數28擬合的效果很不錯,雖然可能稍微偏小了一點點。當然我們可以不斷調校參數來擬合的更好些,但是更準確的辦法是通過算法來生成它們,這個過程就被稱為模型訓練(model training)。最常用的方法是期望***(EM)算法,待會給大家詳細講解。
順便說一句,采樣的數據和全體數據的分布情況總是存在一定差異的。這里首先假設了采集的334個用戶的數據能代表全體人口的身高分布。另外我們還假定了隱含的數據分布是高斯分布,并以此來繪制分布曲線,并以此為前提預估潛在的分布情況。如果采集越來越多的數據,通常身高的分布越來越趨近于高斯(盡管仍然有其他不確定因素),模型訓練的目的就是在這些假設前提下盡可能降低不確定性。
2. 期望***與高斯模型訓練
模型的EM訓練過程,直觀的來講是這樣:我們通過觀察采樣的概率值和模型概率值的接近程度,來判斷一個模型是否擬合良好。然后通過調整模型以讓新模型更適配采樣的概率值。反復迭代這個過程很多次,直到兩個概率值非常接近時,我們停止更新并完成模型訓練。
現在我們要將這個過程用算法來實現,所使用的方法是模型生成的數據來決定似然值,即通過模型來計算數據的期望值。通過更新參數μ和σ來讓期望值***化。這個過程可以不斷迭代直到兩次迭代中生成的參數變化非常小為止。該過程和k-means的算法訓練過程很相似(k-means不斷更新類中心來讓結果***化),只不過在這里的高斯模型中,我們需要同時更新兩個參數:分布的均值和標準差
3. 高斯混合模型(GMM)
高斯混合模型是對高斯模型進行簡單的擴展,GMM使用多個高斯分布的組合來刻畫數據分布。
舉個具體例子來給大家說明:想象下現在咱們不再考察全部用戶的身高,而是要在模型中同時考慮男性和女性的身高。假定之前的樣本里男女都有,那么之前所畫的高斯分布其實是兩個高斯分布的疊加的結果。相比只使用一個高斯來建模,現在我們可以用兩個(或多個)高斯分布:
該公式和之前的公式非常相似,細節上有幾點差異。首先分布概率是K個高斯分布的和,每個高斯分布有屬于自己的μ和σ參數,以及對應的權重參數 ,權重值必須為正數,所有權重的和必須等于1,以確保公式給出數值是合理的概率密度值。換句話說,如果我們把該公式對應的輸入空間合并起來,結果將等于1。
回到之前的例子,女性在身高分布上通常要比男性矮,如圖3所示:
圖3:男性和女性身高的概率分布圖
圖3的y-軸所示的概率值,是在已知每個用戶性別的前提下計算出來的。但通常情況下我們并不能掌握這個信息(也許在采集數據時沒記錄),因此不僅要學出每種分布的參數,還需要生成性別的劃分情況( )。當決定期望值時,需要將權重值分別生成男性和女性的相應身高概率值并相加。
注意雖然現在模型更復雜了,但仍然可使用與之前相同的技術進行模型訓練。在計算期望值時(很可能通過已被混合的數據生成),只需要一個更新參數的***化期望策略。
4. 高斯混合模型的學習實例
前面的簡單例子里使用了一維高斯模型:即只有一個特征(身高)。但高斯不僅局限于一維,很容易將均值擴展為向量,標準差擴展為協方差矩陣,用n-維高斯分布來描述多維特征。接下來的程序清單里展示了通過scikit-learn的高斯混合模型運行聚類并對結果進行可視化展示。
在初始化GMM算法時,傳入了以下參數:
- -n_components ——用戶混合的高斯分布的數量。之前的例子里是2個。
- -covariance_type ——約定協方差矩陣的屬性,即高斯分布的形狀。參考下面文檔來具體了解:http://scikit-learn.org/stable/modules/mixture.html
- -n_iter —— EM的迭代運行次數。
計算結果如下圖(Iris數據集):
- 有關make_ellipses ——make_ellipses來源于plot_gmm_classifier方法,作者為scikit-learn的Ron Weiss和Gael Varoquaz。根據協方差矩陣繪制的二維圖形,可以找出方差***和其次大的坐標方向,以及相對應的量級。然后使用這些坐標軸將相應的高斯分布的橢圓圖形繪制出來。這些軸方向和量級分別被稱為特征向量(eigenvectors)和特征值(eigenvalues)。
圖4:展示了Iris數據集的4-D高斯聚類結果在二維空間上的映射圖
make_ellipses方法在概念上很簡單,它將gmm對象(訓練模型)、坐標軸、以及x和y坐標索引作為參數,運行后基于指定的坐標軸繪制出相應的橢圓圖形。
5. k-means和GMM的關系
在特定條件下,k-means和GMM方法可以互相用對方的思想來表達。在k-means中,根據距離每個點最接近的類中心來標記該點的類別,這里存在的假設是每個類簇的尺度接近且特征的分布不存在不均勻性。這也解釋了為什么在使用k-means前對數據進行歸一會有效果。高斯混合模型則不會受到這個約束,因為它對每個類簇分別考察特征的協方差模型。
K-means算法可以被視為高斯混合模型(GMM)的一種特殊形式。整體上看,高斯混合模型能提供更強的描述能力,因為聚類時數據點的從屬關系不僅與近鄰相關,還會依賴于類簇的形狀。n維高斯分布的形狀由每個類簇的協方差來決定。在協方差矩陣上添加特定的約束條件后,可能會通過GMM和k-means得到相同的結果。
實踐中如果每個類簇的協方差矩陣綁定在一起(就是說它們完全相同),并且矩陣對角線上的協方差數值保持相同,其他數值則全部為0,這樣能夠生成具有相同尺寸且形狀為圓形類簇。在此條件下,每個點都始終屬于最近的中間點對應的類。
在k-means方法中,使用EM來訓練高斯混合模型時對初始值的設置非常敏感。而對比k-means,GMM方法有更多的初始條件要設置。實踐中不僅初始類中心要指定,而且協方差矩陣和混合權重也要設置。這里可以運行k-means來生成類中心,并以此作為高斯混合模型的初始條件。由此可見兩個算法有相似的處理過程,主要區別在于模型的復雜度不同。
整體來看,所有無監督機器學習算法都遵循一條簡單的模式:給定一系列數據,訓練出一個能描述這些數據規律的模型(并期望潛在過程能生成數據)。訓練過程通常要反復迭代,直到無法再優化參數獲得更貼合數據的模型為止。
【本文為51CTO專欄作者“達觀數據”的原創稿件,轉載可通過51CTO專欄獲取聯系】
































