复现经典:《统计学习方法》第 9 章 EM 算法及其推广
本文是李航老師的《統(tǒng)計學(xué)習(xí)方法》[1]一書的代碼復(fù)現(xiàn)。
作者:黃海廣[2]
備注:代碼都可以在github[3]中下載。
我將陸續(xù)將代碼發(fā)布在公眾號“機(jī)器學(xué)習(xí)初學(xué)者”,敬請關(guān)注。
代碼目錄
第 1 章 統(tǒng)計學(xué)習(xí)方法概論
第 2 章 感知機(jī)
第 3 章 k 近鄰法
第 4 章 樸素貝葉斯
第 5 章 決策樹
第 6 章 邏輯斯諦回歸
第 7 章 支持向量機(jī)
第 8 章 提升方法
第 9 章 EM 算法及其推廣
第 10 章 隱馬爾可夫模型
第 11 章 條件隨機(jī)場
第 12 章 監(jiān)督學(xué)習(xí)方法總結(jié)
代碼參考:wzyonggege[4],WenDesi[5],火燙火燙的[6]
第 9 章 EM 算法及其推廣
Expectation Maximization algorithm
Maximum likehood function
likehood & maximum likehood[7]
1.EM 算法是含有隱變量的概率模型極大似然估計或極大后驗概率估計的迭代算法。含有隱變量的概率模型的數(shù)據(jù)表示為?)。這里,是觀測變量的數(shù)據(jù),是隱變量的數(shù)據(jù),?是模型參數(shù)。EM 算法通過迭代求解觀測數(shù)據(jù)的對數(shù)似然函數(shù)的極大化,實現(xiàn)極大似然估計。每次迭代包括兩步:
步,求期望,即求?)關(guān)于)的期望:
稱為函數(shù),這里是參數(shù)的現(xiàn)估計值;
步,求極大,即極大化函數(shù)得到參數(shù)的新估計值:
在構(gòu)建具體的 EM 算法時,重要的是定義函數(shù)。每次迭代中,EM 算法通過極大化函數(shù)來增大對數(shù)似然函數(shù)。
2.EM 算法在每次迭代后均提高觀測數(shù)據(jù)的似然函數(shù)值,即
在一般條件下 EM 算法是收斂的,但不能保證收斂到全局最優(yōu)。
3.EM 算法應(yīng)用極其廣泛,主要應(yīng)用于含有隱變量的概率模型的學(xué)習(xí)。高斯混合模型的參數(shù)估計是 EM 算法的一個重要應(yīng)用,下一章將要介紹的隱馬爾可夫模型的非監(jiān)督學(xué)習(xí)也是 EM 算法的一個重要應(yīng)用。
4.EM 算法還可以解釋為函數(shù)的極大-極大算法。EM 算法有許多變形,如 GEM 算法。GEM 算法的特點是每次迭代增加函數(shù)值(并不一定是極大化函數(shù)),從而增加似然函數(shù)值。
在統(tǒng)計學(xué)中,似然函數(shù)(likelihood function,通常簡寫為 likelihood,似然)是一個非常重要的內(nèi)容,在非正式場合似然和概率(Probability)幾乎是一對同義詞,但是在統(tǒng)計學(xué)中似然和概率卻是兩個不同的概念。概率是在特定環(huán)境下某件事情發(fā)生的可能性,也就是結(jié)果沒有產(chǎn)生之前依據(jù)環(huán)境所對應(yīng)的參數(shù)來預(yù)測某件事情發(fā)生的可能性,比如拋硬幣,拋之前我們不知道最后是哪一面朝上,但是根據(jù)硬幣的性質(zhì)我們可以推測任何一面朝上的可能性均為 50%,這個概率只有在拋硬幣之前才是有意義的,拋完硬幣后的結(jié)果便是確定的;而似然剛好相反,是在確定的結(jié)果下去推測產(chǎn)生這個結(jié)果的可能環(huán)境(參數(shù)),還是拋硬幣的例子,假設(shè)我們隨機(jī)拋擲一枚硬幣 1,000 次,結(jié)果 500 次人頭朝上,500 次數(shù)字朝上(實際情況一般不會這么理想,這里只是舉個例子),我們很容易判斷這是一枚標(biāo)準(zhǔn)的硬幣,兩面朝上的概率均為 50%,這個過程就是我們運用出現(xiàn)的結(jié)果來判斷這個事情本身的性質(zhì)(參數(shù)),也就是似然。
E step:
import numpy as np import math pro_A, pro_B, por_C = 0.5, 0.5, 0.5def pmf(i, pro_A, pro_B, por_C):pro_1 = pro_A * math.pow(pro_B, data[i]) * math.pow((1 - pro_B), 1 - data[i])pro_2 = pro_A * math.pow(pro_C, data[i]) * math.pow((1 - pro_C), 1 - data[i])return pro_1 / (pro_1 + pro_2)M step:
class EM:def __init__(self, prob):self.pro_A, self.pro_B, self.pro_C = prob# e_stepdef pmf(self, i):pro_1 = self.pro_A * math.pow(self.pro_B, data[i]) * math.pow((1 - self.pro_B), 1 - data[i])pro_2 = (1 - self.pro_A) * math.pow(self.pro_C, data[i]) * math.pow((1 - self.pro_C), 1 - data[i])return pro_1 / (pro_1 + pro_2)# m_stepdef fit(self, data):count = len(data)print('init prob:{}, {}, {}'.format(self.pro_A, self.pro_B,self.pro_C))for d in range(count):_ = yield_pmf = [self.pmf(k) for k in range(count)]pro_A = 1 / count * sum(_pmf)pro_B = sum([_pmf[k] * data[k] for k in range(count)]) / sum([_pmf[k] for k in range(count)])pro_C = sum([(1 - _pmf[k]) * data[k]for k in range(count)]) / sum([(1 - _pmf[k])for k in range(count)])print('{}/{} pro_a:{:.3f}, pro_b:{:.3f}, pro_c:{:.3f}'.format(d + 1, count, pro_A, pro_B, pro_C))self.pro_A = pro_Aself.pro_B = pro_Bself.pro_C = pro_C data=[1,1,0,1,0,0,1,0,1,1] em = EM(prob=[0.5, 0.5, 0.5]) f = em.fit(data) next(f) init prob:0.5, 0.5, 0.5 # 第一次迭代 f.send(1) 1/10 pro_a:0.500, pro_b:0.600, pro_c:0.600 # 第二次 f.send(2)2/10 pro_a:0.500, pro_b:0.600, pro_c:0.600 em = EM(prob=[0.4, 0.6, 0.7]) f2 = em.fit(data) next(f2)init prob:0.4, 0.6, 0.7 f2.send(1)1/10 pro_a:0.406, pro_b:0.537, pro_c:0.643 f2.send(2)2/10 pro_a:0.406, pro_b:0.537, pro_c:0.643參考資料
[1] 《統(tǒng)計學(xué)習(xí)方法》:?https://baike.baidu.com/item/統(tǒng)計學(xué)習(xí)方法/10430179
[2] 黃海廣:?https://github.com/fengdu78
[3] github:?https://github.com/fengdu78/lihang-code
[4] wzyonggege:?https://github.com/wzyonggege/statistical-learning-method
[5] WenDesi:?https://github.com/WenDesi/lihang_book_algorithm
[6] 火燙火燙的:?https://blog.csdn.net/tudaodiaozhale
[7] likehood & maximum likehood:?http://fangs.in/post/thinkstats/likelihood/
往期精彩回顧
那些年做的學(xué)術(shù)公益-你不是一個人在戰(zhàn)斗
適合初學(xué)者入門人工智能的路線及資料下載
吳恩達(dá)機(jī)器學(xué)習(xí)課程筆記及資源(github標(biāo)星12000+,提供百度云鏡像)
吳恩達(dá)深度學(xué)習(xí)筆記及視頻等資源(github標(biāo)星8500+,提供百度云鏡像)
《統(tǒng)計學(xué)習(xí)方法》的python代碼實現(xiàn)(github標(biāo)星7200+)
機(jī)器學(xué)習(xí)的數(shù)學(xué)精華(在線閱讀版)
備注:加入本站微信群或者qq群,請回復(fù)“加群”
加入知識星球(4300+用戶,ID:92416895),請回復(fù)“知識星球”
總結(jié)
以上是生活随笔為你收集整理的复现经典:《统计学习方法》第 9 章 EM 算法及其推广的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复现经典:《统计学习方法》第 11 章
- 下一篇: 复现经典:《统计学习方法》第 10 章