em算法怎么对应原有分类_机器学习基础-EM算法
EM算法也稱期望最大化(Expectation-Maximum,簡稱EM)算法,它是一個基礎算法,是很多機器學習領域算法的基礎,比如隱式馬爾科夫算法(HMM), LDA主題模型的變分推斷等等。本文就對EM算法的原理做一個總結。
EM算法要解決的問題
我們經常會從樣本觀察數據中,找出樣本的模型參數。 最常用的方法就是極大化模型分布的對數似然函數。
但是在一些情況下,我們得到的觀察數據有未觀察到的隱含數據,此時我們未知的有隱含數據和模型參數,因而無法直接用極大化對數似然函數得到模型分布的參數。怎么辦呢?這就是EM算法可以派上用場的地方了。
EM算法解決這個的思路是使用啟發式的迭代方法,既然我們無法直接求出模型分布參數,那么我們可以先猜想隱含數據(EM算法的E步),接著基于觀察數據和猜測的隱含數據一起來極大化對數似然,求解我們的模型參數(EM算法的M步)。由于我們之前的隱藏數據是猜測的,所以此時得到的模型參數一般還不是我們想要的結果。不過沒關系,我們基于當前得到的模型參數,繼續猜測隱含數據(EM算法的E步),然后繼續極大化對數似然,求解我們的模型參數(EM算法的M步)。以此類推,不斷的迭代下去,直到模型分布參數基本無變化,算法收斂,找到合適的模型參數。
從上面的描述可以看出,EM算法是迭代求解最大值的算法,同時算法在每一次迭代時分為兩步,E步和M步。一輪輪迭代更新隱含數據和模型分布參數,直到收斂,即得到我們需要的模型參數。
一個最直觀了解EM算法思路的是K-Means算法,見之前寫的K-Means聚類算法原理。在K-Means聚類時,每個聚類簇的質心是隱含數據。我們會假設K個初始化質心,即EM算法的E步;然后計算得到每個樣本最近的質心,并把樣本聚類到最近的這個質心,即EM算法的M步。重復這個E步和M步,直到質心不再變化為止,這樣就完成了K-Means聚類。
當然,K-Means算法是比較簡單的,實際中的問題往往沒有這么簡單。上面對EM算法的描述還很粗糙,我們需要用數學的語言精準描述。
EM算法的推導
對于m個樣本觀察數據
,找出樣本的模型參數
,極大化模型分布的對數似然函數如下:
如果我們得到的觀察數據有未觀察到的隱含數據
,此時我們的極大化模型分布的對數似然函數如下:
上面這個式子是沒有 辦法直接求出
的。因此需要一些特殊的技巧,我們首先對這個式子進行縮放如下:
上面第(1)式引入了一個未知的新的分布
,第(2)式用到了Jensen不等式:
或者說由于對數函數是凹函數,所以有:
此時如果要滿足Jensen不等式的等號,則有:
由于
是一個分布,所以滿足:
從上面兩式,我們可以得到:
如果
, 則第(2)式是我們的包含隱藏數據的對數似然的一個下界。如果我們能極大化這個下界,則也在嘗試極大化我們的對數似然。即我們需要最大化下式:
去掉上式中為常數的部分,則我們需要極大化的對數似然下界為:
上式也就是我們的EM算法的M步,那E步呢?注意到上式中
是一個分布,因此
可以理解為
基于條件概率分布
的期望。
至此,我們理解了EM算法中E步和M步的具體數學含義。
EM算法流程
現在我們總結下EM算法的流程。
輸入:觀察數據
,聯合分布
,條件分布
,最大迭代次數J。
1) 隨機初始化模型參數
的值
2) for j from 1 to J開始EM算法迭代:
a) E步:計算聯合分布的條件概率期望:
b) M步:極大化
,得到
:
c) 如果
已收斂,則算法結束。否則繼續回到步驟a)進行E步迭代。
輸出:模型參數
。
EM算法收斂性思考
EM算法的流程并不復雜,但是還有兩個問題需要我們思考:
1) EM算法能保證收斂嗎?
2) EM算法如果收斂,那么能保證收斂到全局最大值嗎?
首先我們來看第一個問題, EM算法的收斂性。要證明EM算法收斂,則我們需要證明我們的對數似然函數的值在迭代的過程中一直在增大。即:
由于
令:
上兩式相減得到:
在上式中分別取
為
和
,并相減得到:
要證明EM算法的收斂性,我們只需要證明上式的右邊是非負的即可。
由于
使得
極大,因此有:
而對于第二部分,我們有:
其中第(4)式用到了Jensen不等式,只不過和第二節的使用相反而已,第(5)式用到了概率分布累積為1的性質。
至此,我們得到了:
證明了EM算法的收斂性。
從上面的推導可以看出,EM算法可以保證收斂到一個穩定點,但是卻不能保證收斂到全局的極大值點,因此它是局部最優的算法,當然,如果我們的優化目標
是凸的,則EM算法可以保證收斂到全局最大值,這點和梯度下降法這樣的迭代算法相同。至此我們也回答了上面提到的第二個問題。
總結
以上是生活随笔為你收集整理的em算法怎么对应原有分类_机器学习基础-EM算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言面向对象编程(五):单链表实现
- 下一篇: C语言实现面向对象示例