我一直在自我学习期望最大化最近,抢下自己在这个过程中一些简单的例子:
http://cs.dartmouth.edu/~cs104/CS104_11.04.22.pdf有3枚硬币0,当扔1和2与头P0,P1和P2概率着陆。 抛硬币0,如果结果是头,簸别的硬币1三次抛硬币2个三次。 由硬币1和2产生的观察到的数据是这样的:HHH,TTT,HHH,TTT,HHH。 隐藏的数据是硬币0的结果。 估计P0,P1和P2。
http://ai.stanford.edu/~chuongdo/papers/em_tutorial.pdf有两个硬币A和B PA和PB是在头部的概率降落时抛出。 每一轮,随机选择一个硬币折腾10次并记录结果。 所观察到的数据是由这两种硬币所提供的抛结果。 但是,我们不知道被选定为特定圆其硬币。 估计PA和PB。
虽然我可以得到的计算,我可以不涉及他们解决了原来的EM理论的方式。 具体而言,这两个例子中的M-步骤过程中,我没有看到他们是如何最大化的东西。 这似乎只是他们重新计算参数,不管怎样,新的参数比旧的好。 此外,两个E-步骤连看都不看彼此相似,更何况原有理论的E-步骤。
那么究竟是如何做到这些例子的工作?
Answer 1:
第二PDF不会下载我,但我还参观了维基百科页面http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm它有更多的信息。 http://melodi.ee.washington.edu/people/bilmes/mypapers/em.pdf (号称是一个温和的介绍)可能是值得一试了。
EM算法的全部要点是寻找一种最大限度地观察到的数据的似然参数。 这是第一个PDF,方程资本西塔标ML的第8页上唯一的圆点。
EM算法就派上用场了哪里有隐藏的数据这会使得问题容易,如果你知道这一点。 在三个硬币例如,这是抛硬币0的结果,如果你知道的那个结果,你可以(当然)产生估计硬币0调高头的概率。 你也知道硬币1或2硬币是否扔在下一阶段的三倍,这将让你做出估计的硬币1和硬币2调高头的概率。 从硬币0的结果对于一个硬币是获得 - 这些估计会说,他们最大的观测数据,这不仅包括您给出的结果,还以为你是不是隐藏数据的可能性是合理的单挑和B尾巴你会发现,对于一个头的概率最大可能是A /(A + B) - 它可能是值得您详细的工作了这一点,因为它是用于M步积木。
在EM算法,你说,虽然你不知道的隐藏数据,你有概率估计它允许你记下它的概率分布进来了。 对于隐藏数据的每个可能值,你会发现这将优化数据包括隐藏数据的数似然的参数值,而这几乎总是原来是指计算某种加权平均(如果没有的EM步骤可以是太困难而不实用)。
什么是EM算法要求你做的是找到这些参数最大限度地通过所有可能隐藏的数据值,其中权重由相关的隐藏数据的概率给定的日志可能性的加权和给出了使用的参数观测启动EM一步。 这是几乎每个人,包括维基百科的算法,调用Q-功能。 维基百科的文章中给出的EM算法背后的证明,表示,如果更改参数,从而增加了Q-功能(这只是达到目的的一种手段),你会也改变了他们,从而增加观察到的数据(你关心)的可能性。 你往往会在实践中发现的是,你可以使用的,如果你知道隐藏的数据,你会做什么,但使用隐藏数据的概率的变化,最大限度的Q-函数给出的EM-开始时估计步骤,体重在某些方面的意见。
在你的例子就意味着totting起来的各硬币产生的头部和尾部的数量。 在PDF他们制定出P(Y = H | X =)= 0.6967。 这意味着,使用重量0.6967的情况下Y = H,这意味着您由0.6967递增计数Y = H和3 * 0.6967递增计数X = H在硬币1,而你递增Y的计数= T由0.3033和3 * 0.3033递增计数X = H在硬币2。 如果您对为什么A /(A + B)是在标准情况下硬币概率的最大似然的详细理由,你应该准备把它变成为为什么这个加权更新方案最大化Q函数的理由。
最后,观测数据的对数似然(你是最大化的事)给你一个非常有用的检查。 它应与每一步EM增加,至少直到你如此接近收敛舍入误差进来,在这种情况下,你可能有一个非常小的降低,信号收敛。 如果急剧下降,你有你的程序或数学的错误。
Answer 2:
幸运的是,我一直在用这种材料挣扎最近为好。 这里是我所认为的那样:
考虑一个相关的,但不同的算法称为分类-最大化算法,我们可以作为一个解决方案技术的混合模型问题,请使用。 混合模型问题是其中我们有可能由任何的N个不同的工艺,其中我们知道的一般形式(例如,高斯分布)产生的数据的序列,但我们不知道的处理的参数(例如,装置和/或方差),并且可能甚至不知道该过程的相对似然。 (典型地,我们至少知道的过程的数目。如果没有,我们是成所谓的“非参数”领土。)在某种意义上,其产生每个数据的过程是“丢失”或“隐藏”数据的问题。
现在,这个相关的分类,最大化算法确实是开始与工艺参数的一些任意猜测。 每个数据点是根据那些参数的过程中的每一个评价,以及一组概率是generated--的概率是由所述第一过程,第二过程,等等,直至最后的第N个过程中产生的数据点。 然后每个数据点是根据最可能的处理分类 。
在这一点上,我们有我们的数据分成N个不同的类别。 因此,对于每一类的数据,我们可以用一些相对简单的演算,优化该集群的参数具有最大似然技术。 (如果我们试图做到这一点对整个数据进行分类之前的设置,它通常是分析棘手。)
然后我们更新参数猜测,重新进行分类,更新我们的参数,重新进行分类,等等,直到收敛。
什么是最大期望算法的作用是相似的,但更普遍的:不是数据点的硬分类为1级,2级,...通过N级的,我们现在用一个柔软的分类,其中每个数据点所属以某种概率各处理。 (显然,每个点的概率需要总结为一个,所以有一些正常化事情。)我想我们可能也认为这是每个进程/猜测其为每个数据的一定量的“解释力”的点。
所以,现在,而不是相对于猜测优化到绝对属于每个类(忽略万万不点)点,我们在那些柔软的分类,或者那些解释权力的背景下重新优化的猜测。 而恰巧的是,如果你写正确的方式表达,你想提高是一个函数,是在形式上的期望 。
随着中说,有一些注意事项:
1)这听起来很容易。 实在不行,至少对我来说。 文献中充斥着的特殊的技巧大杂烩和使用techniques--可能性表达式代替概率表达式,变换到对数似然性,使用指示变量,将它们放在基础矢量形式并把它们在指数等
这些可能是更多的帮助,一旦你有一般的想法,但他们也可以混淆的核心思想。
2)你有问题不管约束可能会非常棘手纳入框架。 特别是,如果你知道每个过程的概率,你可能在良好的状态是。 如果没有,你也估计那些和过程的概率之和必须为一个; 他们必须生活在一个单纯的概率。 它并不总是显而易见如何保持这些限制不变。
3)这是一个足够一般的技术,我不知道我怎么会去写代码,一般。 该应用程序远远超出了简单的集群,并延伸到很多情况下,你实际上是缺失的数据, 或者丢失数据的假设可能会帮助你。 有一个在工作中的魔王别出心裁这里,对于许多应用。
4)该技术被证明收敛,但收敛不一定是全球最大的; 警惕。
我发现下面的链接在未来与上面的解释有所帮助: 统计学习幻灯片
而下面写了进入的一些痛苦的数学细节非常详细: 迈克尔·柯林斯写了
Answer 3:
我写在Python下面的代码说明了你给出的例子第二个例子纸由Do和Batzoglou。
我建议你读这个链接首先为的“weightA”和“weightB”中的代码如何和为什么下面得到一个明确的解释。
免责声明:代码的工作,但我可以肯定,它不是最佳的编码。 我不是一个Python编码器正常,并用它两个星期前已经开始。
import numpy as np
import math
#### E-M Coin Toss Example as given in the EM tutorial paper by Do and Batzoglou* ####
def get_mn_log_likelihood(obs,probs):
""" Return the (log)likelihood of obs, given the probs"""
# Multinomial Distribution Log PMF
# ln (pdf) = multinomial coeff * product of probabilities
# ln[f(x|n, p)] = [ln(n!) - (ln(x1!)+ln(x2!)+...+ln(xk!))] + [x1*ln(p1)+x2*ln(p2)+...+xk*ln(pk)]
multinomial_coeff_denom= 0
prod_probs = 0
for x in range(0,len(obs)): # loop through state counts in each observation
multinomial_coeff_denom = multinomial_coeff_denom + math.log(math.factorial(obs[x]))
prod_probs = prod_probs + obs[x]*math.log(probs[x])
multinomial_coeff = math.log(math.factorial(sum(obs))) - multinomial_coeff_denom
likelihood = multinomial_coeff + prod_probs
return likelihood
# 1st: Coin B, {HTTTHHTHTH}, 5H,5T
# 2nd: Coin A, {HHHHTHHHHH}, 9H,1T
# 3rd: Coin A, {HTHHHHHTHH}, 8H,2T
# 4th: Coin B, {HTHTTTHHTT}, 4H,6T
# 5th: Coin A, {THHHTHHHTH}, 7H,3T
# so, from MLE: pA(heads) = 0.80 and pB(heads)=0.45
# represent the experiments
head_counts = np.array([5,9,8,4,7])
tail_counts = 10-head_counts
experiments = zip(head_counts,tail_counts)
# initialise the pA(heads) and pB(heads)
pA_heads = np.zeros(100); pA_heads[0] = 0.60
pB_heads = np.zeros(100); pB_heads[0] = 0.50
# E-M begins!
delta = 0.001
j = 0 # iteration counter
improvement = float('inf')
while (improvement>delta):
expectation_A = np.zeros((5,2), dtype=float)
expectation_B = np.zeros((5,2), dtype=float)
for i in range(0,len(experiments)):
e = experiments[i] # i'th experiment
ll_A = get_mn_log_likelihood(e,np.array([pA_heads[j],1-pA_heads[j]])) # loglikelihood of e given coin A
ll_B = get_mn_log_likelihood(e,np.array([pB_heads[j],1-pB_heads[j]])) # loglikelihood of e given coin B
weightA = math.exp(ll_A) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of A proportional to likelihood of A
weightB = math.exp(ll_B) / ( math.exp(ll_A) + math.exp(ll_B) ) # corresponding weight of B proportional to likelihood of B
expectation_A[i] = np.dot(weightA, e)
expectation_B[i] = np.dot(weightB, e)
pA_heads[j+1] = sum(expectation_A)[0] / sum(sum(expectation_A));
pB_heads[j+1] = sum(expectation_B)[0] / sum(sum(expectation_B));
improvement = max( abs(np.array([pA_heads[j+1],pB_heads[j+1]]) - np.array([pA_heads[j],pB_heads[j]]) ))
j = j+1
Answer 4:
理解这一点的关键是知道的辅助变量是什么,使估计微不足道。 我将很快解释第一个例子中,第二遵循类似的模式。
增加头/尾的每个序列两个二元变量,这表明硬币1是否被使用或硬币2.现在我们的数据如下所示:
C_11 C_12 C_21 C_22 C_31 C_32 ...
对于每一个我,要么c_i1 = 1个或c_i2 = 1,另一个是0。如果我们知道这些变量了我们的样本中的值,参数估计将是微不足道的:P1将是头在样本的比例,其中c_i1 = 1,同样的c_i2和\拉姆达将是c_i1s的平均值。
但是,我们不知道这些二进制变量的值。 所以,我们基本上做的是猜他们(在现实中,把他们的期望),然后更新我们的模型假定我们猜测的参数是正确的。 所以电子一步是走c_i1s和c_i2s的期望。 M个步骤是采取P_1,P_2和给出这些CS \拉姆达的最大似然估计。
这是否让更多的意义吗? 如果你愿意,我可以写出来为E和M步更新。 EM那么就保证按照以下步骤,十有八九会不会减少为迭代增加。
文章来源: Expectation Maximization coin toss examples