一袁余,思考問題
-
L(x; θ)是似然函數(shù),那么θ代表什么咱揍?
θ代表的是概率颖榜,參考《圖解EM算法投硬幣的例子good.pdf》
尋找具有給定觀測值(x值)的最大可能性的θ值,參考《為什么要使用最大似然估計good.docx》
似然函數(shù)實質(zhì)上是樣本的分布律或分布密度。 -
最大似然估計是干什么的朱转?
就是估計一個最大最接近的真實情況的概率蟹地。
-
最大似然估計法的一般步驟?
寫似然函數(shù)L藤为;取對數(shù)怪与;求導(dǎo)數(shù),得駐點缅疟,最大值點分别;作結(jié)論。
-
最大似然估計和EM算法的區(qū)別存淫?
EM算法中需要用到最大似然估計的思想耘斩。即已知某個參數(shù)能使這個樣本出現(xiàn)的概率最大,我們當(dāng)然不會再去選擇其它小概率的樣本桅咆,所以干脆就把這個參數(shù)作為預(yù)計的真實值括授。
所以M步驟就用到了最大似然去估計Q去優(yōu)化θ。 -
EM算法的終結(jié)條件是什么岩饼?
用迭代法的話荚虚,最后的終止條件可以自定義,當(dāng)?shù)揭欢ù螖?shù)籍茧,或者算法收斂到一定精度則停止版述。參考《圖解EM算法投硬幣的例子good.pdf》大概第10次的時候停止了。一開始的概率θ是估計的寞冯,然后求出期望來代替實際值渴析。就又可以求概率θ。依次循環(huán)的一個過程吮龄。
-
Jasen不等式和EM算法有什么關(guān)系俭茧?
EM算法需要利用Jasen不等式來計算和推導(dǎo)。
-
推導(dǎo)的公式與實際工程計算有什么關(guān)系漓帚?
推導(dǎo)的目的是證明了了l(θ)會單調(diào)增加母债。一種收斂方法是l(θ)不再變化,還有一種就是變化幅度很小胰默。EM可以看作是J的坐標(biāo)上升法,E步固定θ漓踢,優(yōu)化Q牵署,M步固定Q優(yōu)化θ。
直白的說喧半,就是證明每次調(diào)參奴迅,趨勢是向極大似然值走的,并且結(jié)果收斂。
二取具,Python動手實驗
import numpy
import scipy.stats
#硬幣投擲結(jié)果
observations = numpy.array([[1,0,0,0,1,1,0,1,0,1],
[1,1,1,1,0,1,1,1,0,1],
[1,0,1,1,1,1,1,0,1,1],
[1,0,1,0,0,0,1,1,0,0],
[0,1,1,1,0,1,1,1,0,1]])
def em_single(priors,observations):
"""
EM算法的單次迭代
Arguments
------------
priors:[theta_A,theta_B]
observation:[m X n matrix]
Returns
---------------
new_priors:[new_theta_A,new_theta_B]
:param priors:
:param observations:
:return:
"""
counts = {'A': {'H': 0, 'T': 0}, 'B': {'H': 0, 'T': 0}}
theta_A = priors[0]
theta_B = priors[1]
#E step
for observation in observations:
len_observation = len(observation)
num_heads = observation.sum()
num_tails = len_observation-num_heads
#二項分布求解公式
#第一組的10個數(shù)據(jù)中脖隶,包括5正5反,對A投出5正5反的概率為
contribution_A = scipy.stats.binom.pmf(num_heads,len_observation,theta_A)
# 第一組的10個數(shù)據(jù)中暇检,包括5正5反产阱,對B投出5正5反的概率為
contribution_B = scipy.stats.binom.pmf(num_heads,len_observation,theta_B)
#print(contribution_A,contribution_B)
#第一組實驗選擇的硬幣是來自A的概率為
weight_A = contribution_A / (contribution_A + contribution_B)
#第一組實驗選擇的硬幣是來自B的概率為
weight_B = contribution_B / (contribution_A + contribution_B)
#print(weight_A,weight_B)
#更新在當(dāng)前參數(shù)下A,B硬幣產(chǎn)生的正反面次數(shù)
counts['A']['H'] += weight_A * num_heads
counts['A']['T'] += weight_A * num_tails
counts['B']['H'] += weight_B * num_heads
counts['B']['T'] += weight_B * num_tails
# M step
new_theta_A = counts['A']['H'] / (counts['A']['H'] + counts['A']['T'])
new_theta_B = counts['B']['H'] / (counts['B']['H'] + counts['B']['T'])
print(new_theta_A,new_theta_B)
return [new_theta_A,new_theta_B]
def em(observations,prior,tol = 1e-6,iterations=10000):
"""
EM算法
:param observations :觀測數(shù)據(jù)
:param prior:模型初值
:param tol:迭代結(jié)束閾值
:param iterations:最大迭代次數(shù)
:return:局部最優(yōu)的模型參數(shù)
"""
iteration = 0;
while iteration < iterations:
new_prior = em_single(prior,observations)
delta_change = numpy.abs(prior[0]-new_prior[0])
if delta_change < tol:
break
else:
prior = new_prior
iteration +=1
#print(new_prior,iteration)
return [new_prior,iteration]
print("start")
print (em(observations,[0.6,0.5]))
print("end")
三块仆,參考
https://www.cnblogs.com/zfyouxi/p/4297500.html
http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html