關於GMM模型的資料和 EM 參數估算的資料,網上已經有很多了,今天想談的是GMM的協方差矩陣的分析、GMM的參數更新方法
1、GMM協方差矩陣的物理含義
涉及到每個元素,是這樣求算:
用中文來描述就是:
注意後面的那個除以(樣本數-1),就是大括號外面的E求期望 (這叫無偏估計)
上面公式也提到了,協方差本質上是就是很多向量之間的內積,內積的定義如下:
用個具體例子說明, 比如一組數二維數據(二維的數據好說明,比較直觀),它的所有X值、Y值看成一對兒數據,我們得到它們的協方差如下:,這些值可以用矩陣來表示,協方差矩陣: (引自點擊打開鏈接 http://blog.csdn.net/liuheng0111/article/details/52608258)
很顯然,對角線上的數值肯定是大於零的(平方和),其他非對角線上的值是關於主對角線對稱的,這種矩陣叫 正定矩陣 (Positive Definite)
根據向量內積的物理意義和協方差矩陣的幾何意義,我們可以知道:
協方差矩陣實際上形容的就是這些數據之間的協同分佈情況,比如偏向性、數據聚集程度等。
比如用matlab生成一組二維的數據:
mu = [2 3];
SIGMA = [ 3 1; 1 1];
data(1:100,:) = mvnrnd(mu,SIGMA,100);
畫出來它是這樣:
根據協方差矩陣的幾何意義,它的兩個特徵值的開方,即使從單位矩陣(1,0;0,1)圓 變成 橢圓 的兩個軸的放大倍數,seta角就是旋轉角度
對矩陣進行特徵分解:
[V,l] = eig(cov);
S = sqrt(l); %開方,求的放大倍數
R = V; %旋轉矩陣
Tm = R*S; %旋轉+尺度,就是由圓變成有一定傾斜角的橢圓的過程
V = 0.3827 -0.9239 ; -0.9239 -0.3827
l = 0.5858 0 ; 0 3.4142
一般的旋轉矩陣是這樣:
但我們這裏用的旋轉矩陣是從Y軸開始算旋轉角的,並且X軸要做負對稱,所以旋轉矩陣的結果如下:
2、GMM參數更新方法
一般的,GMM的參數更新方法都是EM的方法,這裏說的是梯度下降的方法。
梯度下降也是求一個函數最小值的方法,相比EM的算法,更新速度比較快,缺點是比較容易陷入局部收斂點。
比如給定了一組數(dataset 有一定維度),讓求一個概率最大下的混合高斯函數的參數(目標:每個GMM的 權重係數、均值,協方差)
我們定義了概率函數, (N代表有多少個數據集,M代表有多少混合高斯)
由於給定了一組數據(dataset),我們採用 batch gradient descent 的方法,實際上還有隨機梯度的方法,就是隨機用一個點去更新,基本思路相同。
實際情況下,求上面那個表達式的最大值比較困難的,我們增加一個負號,就可以使用梯度下降法(下降法只能求最小值,最大值一般不用這個方法,對於一般的函數求最大值,需要先判斷是否收斂再求最大值,或者給定參數範圍,這裏不討論),再用log方便表達式求導數,最後還要知道各個待定參數的導數。即我們要計算下面表達式在最小值的情況下,它的參數是什麼
回顧一下梯度下降法:梯度下降法就是沿着 梯度,不斷的去更新參數值,最後達到一定的收斂條件,得到我們要的參數
這裏面η 是學習率 ,後面的重點就是求梯度了(▽爲對矢量做偏導,它是一個矢量, ▽U表示爲矢量U的梯度)
幸好在matrix code book裏面已經給出了三個重要參數的導數: 地址是:【https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf】
注意上面的 協方差矩陣需要保證正定,否則沒有辦法求似然概率。
把梯度下降法的求GMM混合參數的方法寫成如下流程:
給定一組dataset,在這個dataset下進行參數估計
初始化一組GMM的初始值,混合權重,均值,協方差矩陣 Xk(注意Xk不是dataset,是混合參數)
while (比較Yk+1和Yk之間的差值,或者循環次數,如果滿足,跳出)
計算在這個初始值下的似然概率值(注意用log表達,注意我們爲了求最小值給了負號,注意各個dataset中的點的似然概率是乘積關係)
計算各個偏導數,使用梯度下降的方法更新新的Xk+1 = Xk - η*∇(Xk)
比較Xk+1和Xk下面下,這一組dataset的總體似然概率值之差,Yk+1和Yk
Xk+1=Xk ,繼續循環
3、GMM參數更新方法EM和梯度下降法遇到的問題
用EM算法來擬合分類:
使用梯度下降法擬合:
梯度下降法的擬合結果比較依賴於初始值
下面談一下,遇到非正定協方差矩陣的問題;
我們的參數更新方法:對於權重係數和均值更新問題不大,權重可以每次迭代之後要保證總和要等於一。
可能出問題的就是(在某些情況下)協方差矩陣是非正定(非正定沒法Cholesky,沒法求概率),因爲是兩個正定矩陣的相差,它們的差不一定能保證正定,這時候有幾種方法;
1、修改更新之後的協方差矩陣,使得特徵值爲負數的變成 eps (matlab最小正數),結果橢圓塌陷,收斂到兩個直線上:
可以認爲塌陷到直線的兩類是多餘的。
2、修改更新之後的協方差矩陣,使得特徵值爲負數的變成 1它會重新從圓開始計算開始收斂:
3、保持協方差矩陣,若更新之後的協方差矩陣特徵值爲負數,則保持協方差矩陣不變:
結果最終收斂。
另外多提一句
python中的scipy.stats是可以容許奇異的。是不是對計算logpdf有幫助。。。