复现经典:《统计学习方法》第 9 章 EM 算法及其推广
本文是李航老師的《統計學習方法》[1]一書的代碼復現。
作者:黃海廣[2]
備注:代碼都可以在github[3]中下載。
我將陸續將代碼發布在公眾號“機器學習初學者”,敬請關注。
代碼目錄
第 1 章 統計學習方法概論
第 2 章 感知機
第 3 章 k 近鄰法
第 4 章 樸素貝葉斯
第 5 章 決策樹
第 6 章 邏輯斯諦回歸
第 7 章 支持向量機
第 8 章 提升方法
第 9 章 EM 算法及其推廣
第 10 章 隱馬爾可夫模型
第 11 章 條件隨機場
第 12 章 監督學習方法總結
代碼參考:wzyonggege[4],WenDesi[5],火燙火燙的[6]
第 9 章 EM 算法及其推廣
Expectation Maximization algorithm
Maximum likehood function
likehood & maximum likehood[7]
1.EM 算法是含有隱變量的概率模型極大似然估計或極大后驗概率估計的迭代算法。含有隱變量的概率模型的數據表示為?)。這里,是觀測變量的數據,是隱變量的數據,?是模型參數。EM 算法通過迭代求解觀測數據的對數似然函數的極大化,實現極大似然估計。每次迭代包括兩步:
步,求期望,即求?)關于)的期望:
稱為函數,這里是參數的現估計值;
步,求極大,即極大化函數得到參數的新估計值:
在構建具體的 EM 算法時,重要的是定義函數。每次迭代中,EM 算法通過極大化函數來增大對數似然函數。
2.EM 算法在每次迭代后均提高觀測數據的似然函數值,即
在一般條件下 EM 算法是收斂的,但不能保證收斂到全局最優。
3.EM 算法應用極其廣泛,主要應用于含有隱變量的概率模型的學習。高斯混合模型的參數估計是 EM 算法的一個重要應用,下一章將要介紹的隱馬爾可夫模型的非監督學習也是 EM 算法的一個重要應用。
4.EM 算法還可以解釋為函數的極大-極大算法。EM 算法有許多變形,如 GEM 算法。GEM 算法的特點是每次迭代增加函數值(并不一定是極大化函數),從而增加似然函數值。
在統計學中,似然函數(likelihood function,通常簡寫為 likelihood,似然)是一個非常重要的內容,在非正式場合似然和概率(Probability)幾乎是一對同義詞,但是在統計學中似然和概率卻是兩個不同的概念。概率是在特定環境下某件事情發生的可能性,也就是結果沒有產生之前依據環境所對應的參數來預測某件事情發生的可能性,比如拋硬幣,拋之前我們不知道最后是哪一面朝上,但是根據硬幣的性質我們可以推測任何一面朝上的可能性均為 50%,這個概率只有在拋硬幣之前才是有意義的,拋完硬幣后的結果便是確定的;而似然剛好相反,是在確定的結果下去推測產生這個結果的可能環境(參數),還是拋硬幣的例子,假設我們隨機拋擲一枚硬幣 1,000 次,結果 500 次人頭朝上,500 次數字朝上(實際情況一般不會這么理想,這里只是舉個例子),我們很容易判斷這是一枚標準的硬幣,兩面朝上的概率均為 50%,這個過程就是我們運用出現的結果來判斷這個事情本身的性質(參數),也就是似然。
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] 《統計學習方法》:?https://baike.baidu.com/item/統計學習方法/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/
往期精彩回顧
那些年做的學術公益-你不是一個人在戰斗
適合初學者入門人工智能的路線及資料下載
吳恩達機器學習課程筆記及資源(github標星12000+,提供百度云鏡像)
吳恩達深度學習筆記及視頻等資源(github標星8500+,提供百度云鏡像)
《統計學習方法》的python代碼實現(github標星7200+)
機器學習的數學精華(在線閱讀版)
備注:加入本站微信群或者qq群,請回復“加群”
加入知識星球(4300+用戶,ID:92416895),請回復“知識星球”
總結
以上是生活随笔為你收集整理的复现经典:《统计学习方法》第 9 章 EM 算法及其推广的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复现经典:《统计学习方法》第 11 章
- 下一篇: 复现经典:《统计学习方法》第 10 章