机器学习之十大经典算法(九)EM算法
EM算法
? ? ? ? ?一、EM算法簡(jiǎn)介:
EM 算法是Dempster,Laind,Rubin于1977年提出的求參數(shù)極大似然估計(jì)的一種方法,它可以從非完整數(shù)據(jù)集中對(duì)參數(shù)進(jìn)行MLE估計(jì),是一種非常簡(jiǎn)單實(shí)用的學(xué)習(xí)算法。這種方法可以廣泛地應(yīng)用于處理缺損數(shù)據(jù)、截尾數(shù)據(jù)以及帶有噪聲等所謂的不完全數(shù)據(jù)。具體地說(shuō),我們可以利用EM算法來(lái)填充樣本中的缺失數(shù)據(jù)、發(fā)現(xiàn)隱藏變量的值、估計(jì)HMM中的參數(shù)、估計(jì)有限混合分布中的參數(shù)以及可以進(jìn)行無(wú)監(jiān)督聚類等等。
最大期望算法(Expectation Maximization Algorithm,又譯為:期望最大化算法),是一種迭代算法,用于含有隱變量(hidden variable)的概率參數(shù)模型的最大似然估計(jì)或極大后驗(yàn)概率估計(jì)。
在統(tǒng)計(jì)計(jì)算中,最大期望(EM)算法是在概率(probabilistic)模型中尋找參數(shù)最大似然估計(jì)或者最大后驗(yàn)估計(jì)的算法,其中概率模型依賴于無(wú)法觀測(cè)的隱藏變量(Latent Variable)。最大期望經(jīng)常用在機(jī)器學(xué)習(xí)和計(jì)算機(jī)視覺(jué)的數(shù)據(jù)聚類(Data Clustering)領(lǐng)域。
最大期望算法經(jīng)過(guò)兩個(gè)步驟交替進(jìn)行計(jì)算,第一步是計(jì)算期望(E),也就是將隱藏變量象能夠觀測(cè)到的一樣包含在內(nèi)從而計(jì)算最大似然的期望值;另外一步是最大化(M),也就是最大化在 E 步上找到的最大似然的期望值從而計(jì)算參數(shù)的最大似然估計(jì)。M 步上找到的參數(shù)然后用于另外一個(gè) E 步計(jì)算,這個(gè)過(guò)程不斷交替進(jìn)行。
二、基本步驟(具體公式及推導(dǎo),讀者參考其他文獻(xiàn)):
參數(shù)初始化
對(duì)需要估計(jì)的參數(shù)進(jìn)行初始賦值,包括均值、方差、混合系數(shù)以及期望。
E-Step計(jì)算
利用概率分布公式計(jì)算后驗(yàn)概率,即期望。
M-step計(jì)算
重新估計(jì)參數(shù),包括均值、方差、混合系數(shù)并且估計(jì)此參數(shù)下的期望值。
收斂性判斷
將新的與舊的值進(jìn)行比較,并與設(shè)置的閾值進(jìn)行對(duì)比,判斷迭代是否結(jié)束,若不符合條件,則返回到第2步,重新進(jìn)行計(jì)算,直到收斂符合條件結(jié)束。
? ? 三、用python實(shí)現(xiàn)EM算法過(guò)程,下面以投硬幣為例,供讀者研究:
TEST=[[5,5],[9,1],[8,2],[4,6],[7,3]];
#投出來(lái)的結(jié)果,前面是正面向上的次數(shù),每組結(jié)果后面數(shù)字表示反面向上的次數(shù)。
#由于每次投幣要不選擇A或者B,且僅從單個(gè)樣本數(shù)據(jù),無(wú)法獲知,EM算法的主要目標(biāo)是:通過(guò)大量計(jì)算和統(tǒng)計(jì),將數(shù)據(jù)分離或?qū)ふ译[含變量。
print(TEST)#整個(gè)考慮可以從正面入手,反面配合。
def P(sA,sB,t1,t2):???
??? #s是初始的概率,t1取正面的個(gè)數(shù);t2取反面的個(gè)數(shù),以概率密度為準(zhǔn)。
???PA=Cmn(t1+t2,t1)*(sA**t1)*((1-sA)**t2) #計(jì)算A出現(xiàn)的概率。
???PB=Cmn(t1+t2,t1)*(sB**t1)*((1-sB)**t2) #計(jì)算B出現(xiàn)的概率。
???return round(PA/(PA+PB),2)???? #求出新的概率值,然后根據(jù)這個(gè)概率值進(jìn)行后面期望值的計(jì)算;且保留2位有效數(shù)字。
def fac(n):#階乘。
??? f=1
??? fory in range(2,n+1):
???????f=f*y
???return f
def Cmn(m,n):#先定義cmn后面利用這個(gè)概率密度函數(shù),會(huì)使用排列組合關(guān)系。當(dāng)Cm,n=Cm,m-n。減少計(jì)算量。
???s=m-n
??? ifs<n:
???????n=s
???f=1;t=m
??? fory in range(0,n):
???????f=f*t
???????t=t-1
???return f/fac(n)
def CoinAB(oldoA,oldoB):? #計(jì)算期望值,通過(guò)一次期望值的求解,再重新迭代概率值。
???UA1=0;UA2=0;?? ????#UA1和UA2是A硬幣投出的期望值。
???t3=0;t4=0;t5=0;t6=0;? #t3和t4、t5和t6都是為計(jì)算硬幣A和B的期望值。
??? fory in TEST:??????? ?#遍歷所有樣本數(shù)據(jù)。
???????UA1,UA2=y???????? #取當(dāng)前值,前面表示正面,后面表示反面。
???????oA=P(oldoA,oldoB,UA1,UA2)? #計(jì)算出出A硬幣的概率。
???????print(oA,1-oA)????
???????t3=t3+UA1*round(oA,2)??????? #計(jì)算A期望值(針對(duì)正面這個(gè)事實(shí)開(kāi)始討論)
???????t4=t4+UA2*round(oA,2)
???????t5=t5+UA1*round((1-oA),2)??? #計(jì)算B期望值(針對(duì)正面這個(gè)事實(shí)開(kāi)始討論)
???????t6=t6+UA2*round((1-oA),2)?????
???return round(t3/(t3+t4),2),round(t5/(t5+t6),2)? #返回迭代新一輪的A、B的概率。
def EM(oA,oB):
???y=0;? #計(jì)迭代次數(shù)。
???while(1):
???????y=y+1
???????oldoA=oA;oldoB=oB?????? #先存儲(chǔ)迭代數(shù)據(jù),為了計(jì)算收斂值,結(jié)束條件。
???????oA,oB=CoinAB(oldoA,oldoB)? #分別賦值,為了下次使用。
???????print("----y={},oA={},oB={}".format(y,oA,oB))
???????if (oldoA-oA)**2+(oldoB-oB)**2<0.005:#自己設(shè)置收斂條件,目的為終止循環(huán)。
???????????break
???print("oA=",oA,"oB=",oB)???
#oA,oB=eval(input("請(qǐng)輸入初始值-oA,oB,逗號(hào)隔開(kāi):\n"))
oA=0.6
oB=0.4
EM(oA,oB)
大家,加油!
總結(jié)
以上是生活随笔為你收集整理的机器学习之十大经典算法(九)EM算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Firefox七种武器之firebug
- 下一篇: voip技术研究