浅谈贝叶斯

贝叶斯

一、贝叶斯是什么

1.贝叶斯是谁

1.1.贝叶斯的生平

1702-1761,是概率论理论创始人,贝叶斯统计的创立者,“从特殊推论一般、从样本推论全体”的第一人。

贝叶斯曾是对概率论与统计的早期发展有重大影响的两位人物(另一位是布莱斯·帕斯卡Blaise Pascal)之一。

1.2.贝叶斯的研究

贝叶斯主要研究概率论,但对统计领域也有极大贡献。

他首先将归纳推理法用于概率论基础理论,并创立了贝叶斯统计理论,对于统计决策函数、统计推断、统计的估算等做出了贡献。其核心思想是“逆概率”,也就是概率论中的贝叶斯定理,在1763年,贝叶斯去世后两年,贝叶斯的研究被Richard Price整理,贝叶斯公式诞生了。

2.贝叶斯相关理论的发展

2.1.贝叶斯定理

由贝叶斯本人提出。即假设H[1],H[2]…,H[n]互斥且构成一个完全事件,已知它们的概率P(H[i]),i=1,2,…,n,现观察到某事件A与H[1],H[2]…,H[n]相伴随机出现,且已知条件概率P(A|H[i]),求P(H[i]|A)。

不难看出,这个问题涉及全概率公式条件概率定义,问题的解决也就是贝叶斯定理的证明过程,也是贝叶斯公式的推导过程。

2.2.贝叶斯公式

贝叶斯公式由Richard Price基于贝叶斯生前的描述抽象得出。
下面祭出经典中的经典——贝叶斯公式:

p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)} p(BiA)=j=1nP(Bj)P(ABj)P(Bi)P(ABi)

公式左边是 “A发生前提下,Bi发生的概率”;

右面分子是 “Bi发生概率 ” 乘 “Bi发生前提下,A发生的概率”;

右面分母是 “Bj发生的前提下,A发生的概率” 乘以 “Bj发生的概率” 对j累加。

公式的推导如下

首先,根据条件概率的定义,Bi在A发生的前提下发生的概率,就是Bi和A同时发生的概率除以A发生的概率,有 p ( B i ∣ A ) = P ( A B i ) P ( A ) p(B_i|A)=\frac{P(AB_i)}{P(A)} p(BiA)=P(A)P(ABi)

之后,再次运用条件概率定义处理上式分子,A和Bi同时发生的概率,又等于A在Bi发生的前提下发生的概率乘Bi发生的概率(这里实现了左面条件概率的条件结果互换),有 P ( A B i ) = P ( B i ) P ( A ∣ B i ) P(AB_i)=P(B_i)P(A|B_i) P(ABi)=P(Bi)P(ABi)

最后,根据全概率公式处理P(A),这里引入变量j,要求所有的Bj组成全集,即Bj是一个完备事件组。此时有j取1到n时,每种情况发生时事件A发生的概率之和,应该等于P(A)(即全概率公式),有 P ( A ) = ∑ j = 1 n P ( B j ) P ( A ∣ B j ) P(A)=\sum_{j=1}^n P(B_j)P(A|B_j) P(A)=j=1nP(Bj)P(ABj)

将2、3两式带入1式分子和分母,证明完成。

贝叶斯公式也是概率论中的重要公式。

2.3.从贝叶斯公式到贝叶斯学派

可以看到,贝叶斯的贡献主要体现在概率论上,但后人借鉴了贝叶斯公式的思想,经过不断的钻研发展,贝叶斯公式在统计学中的广泛应用远远超过了在概率论中的体现,逐渐形成了贝叶斯统计学和贝叶斯学派。(统计领域两大学派,古典统计学和贝叶斯统计学)

这里补充一段概率论与统计学的区别。概率论试图通过已知的场景/事件/概率模型准确预测未来发生某件事情的概率,得到的结果是确定的,准确的。
统计学是通过某几次重复性实验,猜测场景/事件/概率模型的具体样子,得到的结果是一定不确定的。

概率论如同问,5个白球5个黑球,取一个是黑球的概率;统计学如同问,我取了10次,5白5黑,请猜测有几个白球几个黑球。
可以看到,概率与统计是对立的,互为逆运算的

到如今,贝叶斯公式在统计学中的应用贝叶斯思想仍然被广泛运用于概率论与统计学中(机器学习理论上也是统计的一种)。

3.目前贝叶斯的含义

当下,贝叶斯有两方面含义

3.1.贝叶斯在概率论中的应用

贝叶斯公式在概率论中具有高度概括性,谈及先验概率与后验概率,先验概率指某一事件发生的概率,后验概率指某一事件在其他事件发生的前提下发生的概率‘贝叶斯公式将某事件的后验概率该事件的先验概率和该事件的条件的后验概率表达,体现了概率计算的灵活性。

同时,得到某事件的后验概率通常是非常关键的,它往往比先验概率更关键。比如,病人去医院看病,如果病人表现是发热,我们就迫切希望知道,发热是由感冒导致的概率是多少,由白血病导致的概率是多少,由心情不好导致的概率是多少。只知道发热的概率是0.2%或者知道白血病的概率是0.1%并没有什么用;相反,如果我们知道发热对应的每一症状的概率,就可以更方便的洞察发热的原因,更好的治疗。

3.2.贝叶斯在统计学中的应用

古典统计学认为,未知的模型或者参数变量是确定的,只不过我们不知道它确切的形式或者取值,此时我们通过观察每一事件的频率来推测每一事件的概率。

贝叶斯统计学认为,未知的模型或者参数变量是不确定的,但是这种不确定性可以由一个概率分布来描述,相当于未知模型的不确定性是确定的,是可描述的。

此时,贝叶斯统计不单纯通过频率估计概率,而是使用概率的方法来解决统计学问题。我们会先通过主观判断或过去的经验,对概率分布进行猜测,称为**“先验分布”,之后通过更多的观测值来修正猜测,最后得到的概率分布叫做“后验分布”**。

贝叶斯统计学中的“概率”的概念可以被解释为我们对未知变量不同取值的信心程度的测度(measure of confidence)。贝叶斯统计不消除未知变量的不确定性,而是通过越来越多的新的观测点来持续更新我们对于该未知变量不确定性的认知,提高我们对不确定性的判断的信心

贝叶斯统计的具体应用分支很多,值得我们深入学习。

3.3.概率论与统计的价值

我们在思考贝叶斯的作用时,也应该思考的是概率论与统计本身的价值。

概率论与统计都是针对分类/预测进行的,在考虑分类/预测的计算结果是否正确,统计得到的模型是否准确的同时,更应该考虑分类/预测本身是否有意义。比如,今天我通过大量统计得出,穿蓝衣服的人更容易感冒,穿红衣服的人感冒概率较小,这在数学方面无法反驳,但这样的结果即便正确,也缺乏价值。相比于如何得到正确分类,显然,依据什么进行分类这个问题显得更为紧迫
比如机器学习的过程,今天那识别人脸举例,我们希望得到
我们的统计更应该针对合适的分类,合适的分类依据应该有一些特征,我会在后面进行学习。

二、贝叶斯决策理论

1.什么是贝叶斯决策理论

贝叶斯决策理论,是主观贝叶斯派归纳理论的重要组成部分。 贝叶斯决策就是在不完全情报下,对部分未知的状态用主观概率估计,然后用贝叶斯公式对发生概率进行修正,最后再利用期望值和修正概率做出最优决策。

2.贝叶斯决策理论的数学原理

贝叶斯公式: p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)} p(BiA)=j=1nP(Bj)P(ABj)P(Bi)P(ABi)

3.贝叶斯决策理论的操作过程

Created with Raphaël 2.2.0 开始 确定分类依据(找到特征) 确定先验分布(主观/权威数据) 通过其他样本数据修正先验分布, 也就是学习的过程(贝叶斯公式) 得到后验分布(可能比较复杂) 用得到的后验分布 检验模型是否良好 是否满意当前正确率 结束 yes no yes no

4.贝叶斯决策理论的分支

4.1.测试算法不同产生的分支

什么时候就可以停止训练然后输出结果了呢? 因此许多时候我们需要一个函数衡量模型(后验分布)是不是可以了。

衡量后验分布行不行的算法有许多,如:

最小错误率贝叶斯决策

最小风险贝叶斯决策

4.2.寻找分类依据/特征的方法不同产生的分支

有许多寻找特征的方法,也没有对错之分,具体我会在后期进行学习。

5.评价贝叶斯决策理论

5.1.贝叶斯决策论的优点

因为存在先验概率,因此不需要大量训练数据就可以得到比较准确的结果。
并且有时,先验概率的存在更有利于我们充分利用所有信息

5.2.贝叶斯决策论的缺点

对于输入数据的准备方式较为敏感。(该如何确定特征/分类依据非常灵活,不确定

三、朴素贝叶斯分类器

1.什么是朴素贝叶斯分类器

1.1.朴素贝叶斯分类器的定义

朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器。

该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。

自己的话概括,对于一个分类问题,伴随有一定量的学习数据,我们先找到若干独立特征,再用贝叶斯公式进行学习,最后将各个特征综合起来形成后验分布,也是最终模型。或者:一种基于贝叶斯公式的机器学习算法。(显然,还有很多其他机器学习算法)

可以说,朴素贝叶斯分类器是贝叶斯决策的一种最简单实现

1.2.朴素贝叶斯分类器的发展

朴素贝叶斯分类器没什么发展,因为它真的就是简单的使用贝叶斯公式。但其内在思想,即通过先验分布以及条件概率估计结果,直到如今仍被广泛借鉴,朴素贝叶斯分类器也不断地推出新的模型,达到了更好的拟合效果。

2.朴素贝叶斯分类器的数学原理

贝叶斯公式: p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)} p(BiA)=j=1nP(Bj)P(ABj)P(Bi)P(ABi)

这里用到: p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) P ( A ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{P(A)} p(BiA)=P(A)P(Bi)P(ABi)

形象化: P ( 类 别 ∣ 特 征 ) = P ( 特 征 ∣ 类 别 ) P ( 类 别 ) P ( 特 征 ) P(类别|特征)=\frac{P(特征|类别)P(类别)}{P(特征)} P()=P()P()P()

这里 P ( 类 别 ∣ 特 征 ) P(类别|特征) P()就是我们需要的最终结果,我们需要知道 P ( 特 征 ∣ 类 别 ) P(特征|类别) P() P ( 类 别 ) P(类别) P() P ( 特 征 ) P(特征) P()这三个量,注意,这里一套特征可能包含很多个(就是分类依据可能有很多),但是类别就是最终结果,一套特征只对应一个最终类别

由于我们假设特征之间独立,因此

P ( 特 征 ∣ 类 别 ) = P ( 特 征 1 ∣ 类 别 ) P ( 特 征 2 ∣ 类 别 ) P ( 特 征 3 ∣ 类 别 ) . . . P(特征|类别)=P(特征1|类别)P(特征2|类别)P(特征3|类别)... P()=P(1)P(2)P(3)...

同样的有

P ( 特 征 ) = P ( 特 征 1 ) P ( 特 征 2 ) P ( 特 征 3 ) . . . P(特征)=P(特征1)P(特征2)P(特征3)... P()=P(1)P(2)P(3)...

因此,最终求得后验分布

P ( 类 别 ∣ 特 征 ) = P ( 特 征 1 ∣ 类 别 ) P ( 特 征 2 ∣ 类 别 ) P ( 特 征 3 ∣ 类 别 ) . . . P ( 类 别 ) P ( 特 征 ) = P ( 特 征 1 ) P ( 特 征 2 ) P ( 特 征 3 ) . . . P(类别|特征)=\frac{P(特征1|类别)P(特征2|类别)P(特征3|类别)...P(类别)}{P(特征)=P(特征1)P(特征2)P(特征3)...} P()=P()=P(1)P(2)P(3)...P(1)P(2)P(3)...P()

3.朴素贝叶斯分类器的优化

3.1.根据特征的分布选取朴素贝叶斯模型

经典的朴素贝叶斯模型:

高斯模型:假设特征符合高斯分布(正态分布)

多项式模型:用于离散计数,多次出现的重复词语统计多次

伯努利模型:要求特征必须是0或1(有或没有),把多次出现的词语视作一次

3.2.连续特征分布的转化

对于连续的特征分布(如空气的湿度),我们往往希望其是正态分布,如果不是,应将其转化为正态分布。

对于不连续的特征分布(如某生物是否有犄角),我们往往希望他是伯努利分布,对于有多个选项的特征分布,且该特征一定不能被替代,也可以转化为连续的正态分布或多项式分布模型。

3.3.数据集的修正

如果测试数据集具有“零频率”的问题,应用平滑技术“拉普拉斯估计”修正数据集。

这里我会在后期进行学习。

3.4.特征的选择

对于朴素贝叶斯模型,特征的选择应尽量避免相关性的存在,模型的定义就假设了各特征不相关。

3.5.不同特征分布的整合

朴素贝叶斯模型参数非常少,全部由样本特征选取与先验分布确定。也就是2.1.说到的根据特征分布选取贝叶斯模型。

需要注意的是,如何整合两个不同的模型。比如我们给人分为帅和不帅两类,一个特征是眼睛的面积(大小),属于连续型变量,大概符合正态分布;一个特征是是否是男生,属于伯努利模型,此时需要进行整合,形成一个整体的后验分布

4.朴素贝叶斯分类器操作过程

朴素贝叶斯分类器即是标准的、最简单的贝叶斯决策过程。

Created with Raphaël 2.2.0 开始 确定特征属性 对每个类别计算P(类别) 对每个特征属性计算所有划分的条件概率 对每个类别计算P(特征 以P(特征 经检验,是否满意当前正确率 结束 yes no yes no

下面贴一段最简单的通过朴素贝叶斯分类器进行机器学习的代码。
(纯import,完全没有体现数学原理)

 #Import Library of Gaussian Naive Bayes model
 from sklearn.naive_bayes import GaussianNB
 import numpy as np

 #assigning predictor and target variables
 x= np.array([[-3,7],[1,5], [1,2], [-2,0], [2,3], [-4,0], [-1,1], [1,1], [-2,2], [2,7], [-4,1], [-2,7]])
 Y = np.array([3, 3, 3, 3, 4, 3, 3, 4, 3, 4, 4, 4])

 #Create a Gaussian Classifier
 model = GaussianNB()

 # Train the model using the training sets
 model.fit(x, y)

 #Predict Output
 predicted= model.predict([[1,2],[3,4]])
 print predicted

 Output: ([3,4])

5.评价朴素贝叶斯分类器

5.1.朴素贝叶斯分类器的优点

公式简单

计算简单,所需算力少

由于先验分布的存在,对训练需要的数据数量少

多分类问题中表现良好

5.2.朴素贝叶斯分类器的缺点

太朴素了,每个类别必须独立不影响,这是不可能的

先验分布往往缺乏确定性说服力

确定特征的过程没有确定的方法,往往依赖于主观经验判断

6.参考资料

可以参考 https://zhuanlan.zhihu.com/p/26262151 非常棒的解释

四、半朴素贝叶斯分类器

1.什么是半朴素贝叶斯分类器

1.1.半朴素贝叶斯分类器的定义

在朴素贝叶斯分类器的基础上,考虑一部分特征之间的依赖关系

1.2.半朴素贝叶斯分类器的发展

朴素贝叶斯分类器被提出后,经实践发现,我们选取的特征全部独立基本上是不可能的。但是完全考虑各属性之间的相关性会大大增加计算复杂度。因此如何能更大程度上考虑属性之间的相关性就成了紧迫的问题。

半朴素贝叶斯分类器进一步放松条件独立性假设,假设部分属性之间存在依赖关系

2.半朴素贝叶斯分类器的数学原理

显然,半朴素贝叶斯分类器的核心仍然是贝叶斯公式:

p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)} p(BiA)=j=1nP(Bj)P(ABj)P(Bi)P(ABi)

前面提到,半朴素贝叶斯分类器要考虑部分属性之间的依赖关系,独依赖估计(One-Dependent Estimator,简称ODE)是半朴素贝叶斯分类器最常用的一种策略。顾名思义,即假设每个属性在类别之外最多依赖一个其他属性,即

P ( c ∣ x ) ∝ p ( c ) ∏ i = 1 d p ( x i ∣ c , p a i ) P(c|x)\propto p(c)\prod_{i=1}^d p(x_i|c,pa_i) P(cx)p(c)i=1dp(xic,pai)

式子中 p a i pa_i pai x i x_i xi依赖的属性,称作 x i x_i xi的父属性。这个式子是估计

显然,但我们知道依赖关系后,后验分布是可求的。依赖关系问题关键变为如何求每个属性的父属性。

那么

P ( x ∣ c i ) = ∏ j = 1 d P ( x j ∣ c i , r m p a j ) P(x|c_i)=\prod_{j=1}^d P(x_j|c_i,{rm pa}_j) P(xci)=j=1dP(xjci,rmpaj)

P ( x j ∣ c i , r m p a j ) = P ( x j , c i , r m p a j ) P ( c i , r m p a j ) P(x_j|c_i,{rm pa}_j)=\frac{P(x_j,c_i,{rm pa}_j)}{P(c_i,{rm pa}_j)} P(xjci,rmpaj)=P(ci,rmpaj)P(xj,ci,rmpaj)

3.半朴素贝叶斯分类器的优化

3.1.如何确定每个属性的父属性

方法一:SPODE(Super-Parent ODE)假设所有的属性都依赖于同一个属性,称为超父。

方法二:TAN(Tree Augmented naive Bayes)则在最大带权生成树算法的基础上发展的一种方法。

方法三:AODE(Averaged ODE)是一种集成学习的方法,尝试将每个属性作为超父来构建SPODE,与随机森林的方法有所相似。

4.半朴素贝叶斯分类器的操作流程

请看这位大神 https://www.jianshu.com/p/363abfb24a24

5.评价半朴素贝叶斯分类器

5.1.半朴素贝叶斯分类器的优点

一定程度上考虑了各个特征间的依赖关系,使得模型的假设更加合理。

5.2.半朴素贝叶斯分类器的缺点

没有全面考虑特征间的依赖关系,也就是模型时钟与事实有差距。

先验分布由于特征间的依赖关系需要考虑在内,因此变得更加主观,更加缺乏说服力。

无法确定所考虑的依赖关系有利于模型的拟合,存在考虑依赖关系后,模型更加偏离事实的可能。

五、贝叶斯网络

1.什么是贝叶斯网络

1.1.贝叶斯网络的定义

贝叶斯网络,又称信念网络、信度网络,或是有向无环图模型,是一种概率图型模型。

一个贝叶斯网络是一个有向无环图(Directed Acyclic Graph,DAG),由代表变量结点及连接这些结点有向边构成。结点代表随机变量,结点间的有向边代表了结点间的互相关系(由父结点指向其子结点),用条件概率进行表达关系强度,没有父结点的用先验概率进行信息表达。

通过计算,每一个节点通过计算都有其条件概率表(CPT)(可能是先验概率也可能是后验概率),并且条件概率表只与先验概率和指向它的父节点有关。

1.2.贝叶斯网络的用途

适用于表达和分析不确定性和概率性的事件,应用于有条件地依赖多种控制因素的决策,可以从不完全、不精确或不确定的知识或信息中做出推理。

1.3.贝叶斯网络的发展

从1763年贝叶斯网络的概念被提出,贝叶斯网络不断得到发展与应用。

2.贝叶斯网络的数学原理

最基础的贝叶斯网络,原理即是贝叶斯公式:

p ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) p(B_i|A)=\frac{P(B_i)P(A|B_i)}{\sum_{j=1}^n P(B_j)P(A|B_j)} p(BiA)=j=1nP(Bj)P(ABj)P(Bi)P(ABi)

需要注意,贝叶斯网络中每一个节点只与指向它的父节点有关。

3.贝叶斯网络的衍变

4.贝叶斯网络的操作流程

请看这位大神 https://blog.csdn.net/leida_wt/article/details/88743323

5.评价贝叶斯网络

5.1.贝叶斯网络的优点

贝叶斯网络将有向无环图与概率理论有机结合

贝叶斯网络与一般只是表示方法不同的是对于问题域的建模,当条件或行为等发生变化时,不用对模型进行修正

六、EM算法

1.什么是EM算法

1.1.EM算法的定义

EM算法指最大期望算法(Expectation-Maximization algorithm, EM),也叫Dempster-Laird-Rubin算法。
是一类通过迭代进行极大似然估计(Maximum Likelihood Estimation, MLE)的优化算法 ,通常作为牛顿迭代法(Newton-Raphson method)的替代用于对包含隐变量(latent variable)或缺失数据(incomplete-data)的概率模型进行参数估计。

1.2.EM算法的用途

缺失数据的预测

机器学习算法的参数估计(如高斯混合模型和隐马尔可夫模型)

1.3.EM算法的发展

EM算法起源于误差分析,在极大似然估计(Maximum Likelihood Estimation, MLE)方法出现后,EM算法有了灵魂并逐步发展,EM算法的正式提出来自美国数学家Arthur Dempster、Nan Laird和Donald Rubin,其在1977年发表的研究对先前出现的作为特例的EM算法进行了总结并给出了标准算法的计算步骤,EM算法也由此被称为Dempster-Laird-Rubin算法。

EM算法是MM算法(Minorize-Maximization algorithm)的特例之一,有多个改进版本,包括使用了贝叶斯推断的EM算法、EM梯度算法、广义EM算法等

2.EM算法的数学原理

EM算法的标准计算框架由E步(Expectation-step)和M步(Maximization step)交替组成

这里数学原理很恼火,如果有机会,后期会进行学习。

2.1.E步的数学原理

计算期望(E),利用对隐藏变量的现有估计值,计算其最大似然估计值。

2.2.M步的数学原理

最大化(M),最大化在E步上求得的最大似然值来计算参数的值。M步上找到的参数估计值被用于下一个E步计算中,这个过程不断交替进行。

3.EM算法不同场景下的衍变与优化

3.1.使用了贝叶斯推断的EM算法

3.2.EM梯度算法

3.3.广义EM算法

4.EM算法的操作流程

from scipy import stats
import numpy as np


# 硬币投掷结果观测序列
observations = np.array([[1, 0, 0, 0, 1, 1, 0, 1, 0, 1],
                         [1, 1, 1, 1, 0, 1, 1, 1, 1, 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]
    observations : [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
        contribution_A = stats.binom.pmf(num_heads, len_observation, theta_A)
        contribution_B = stats.binom.pmf(num_heads, len_observation, theta_B)   # 两个二项分布
        weight_A = contribution_A / (contribution_A + contribution_B)
        weight_B = contribution_B / (contribution_A + contribution_B)
        # 更新在当前参数下A、B硬币产生的正反面次数
        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'])
    return [new_theta_A, new_theta_B]
def em(observations, prior, tol=1e-6, iterations=10000):
    """
    EM算法
    :param observations: 观测数据
    :param prior: 模型初值
    :param tol: 迭代结束阈值
    :param iterations: 最大迭代次数
    :return: 局部最优的模型参数
    """
    import math
    iteration = 0
    while iteration < iterations:
        new_prior = em_single(prior, observations)
        delta_change = np.abs(prior[0] - new_prior[0])
        if delta_change < tol:
            break
        else:
            prior = new_prior
            iteration += 1
    return [new_prior, iteration]


if __name__ == "__main__":
    result=em(observations, [0.6, 0.4])
    print(result)

5.评价EM算法

我这么菜,凭什么评价人家?

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值