任务描述
本关任务:理解最大似然法的基本原理并解决实际问题。
相关知识
为了完成本关任务,你需要:
- 理解极大似然原理;
- 理解并掌握极大似然法的数学模型。
极大似然原理
最大似然法是建立在极大似然原理的基础上的一个统计方法。极大似然原理可以这么描述:一个随机试验如有若干个可能的结果A,B,C...,若在一次试验中,结果 A 出现了,那么可以认为实验条件对A的出现有利,即出现的概率 P(A) 较大。
举个简单的例子: 设甲箱中有99个白球,1个黑球;乙箱中有1个白球和99个黑球。现随机取出一箱,再从抽取的一箱中随机取出一球,结果是黑球。这一黑球从乙箱抽取的概率比从甲箱抽取的概率大得多,这时我们自然更多地相信这个黑球是取自乙箱的。
一般说来,事件A发生的概率与某一未知参数θ有关,θ取值不同,则事件A发生的概率P(A∣θ)也不同。当我们在一次试验中事件A发生了,则认为此时的θ值应是一切可能取值中使P(A∣θ)达到最大的那一个。极大似然估计法就是要选取这样的θ值作为参数θ的估计值,使所选取的样本在被选的总体中出现的可能性为最大。
最大似然估计
给定一堆数据,假如我们知道它是从某一种分布中随机取出来的,可是我们并不知道这个分布具体的参,即“模型已定,参数未知”。例如,我们知道这个分布是正态分布,但是不知道均值和方差;或者是二项分布,但是不知道均值。最大似然估计(MLE,Maximum Likelihood Estimation)就可以用来估计模型的参数。MLE 的目标是找出一组参数,使得模型产生出观测数据的概率最大。在图像处理中,最大似然法有很多的应用,例如图像搜索、图像匹配等方面。
最大似然估计是建立在这样的思想上:已知某个参数能使这个样本出现的概率最大,我们当然不会再去选择其他小概率的样本,所以干脆就把这个参数作为估计的真实值。
我们考虑独立同分布的数据集合C={c1,c2,...,cn}来估计参数μ。则联合概率密度函数P(C∣μ)被称为μ相对于C的似然函数: P(c1,c2,…,cn∣μ)=∏i=1nP(ci;μ)
如果μ^是参数空间中能使似然函数最大的μ值,则应该是“最可能”的参数值,那么就是μ^的最大似然估计量。μ^(c1,c2,...,cn)被称为最大似然函数估计值。
编程要求
本次任务考虑一个抛硬币的例子。
问题1:盒子里现在有三枚硬币,由于硬币的质地问题,这三个硬币抛出正面的概率分别为p1=0.34、p2=0.5、p3=0.67。假设我们从一个装了三个硬币的盒子里头取出一枚硬币,我们把这个硬币抛80次(即,我们获取一个采样x1,x2,...,xt并把正面的次数记下来,正面记为H,反面记为T)。并把抛出一个正面的概率记为p,抛出一个反面的概率记为1−p。假设抛出了49个正面,31个反面。这些硬币没有标记,求哪个硬币的可能性最大?
本关的编程任务是,补全右侧编辑器 Begin-End 区间的代码,解决问题 1 提出的问题。具体要求如下:
-
step1 :使用
Factorial
阶乘函数,补全calcu_prob
函数代码,实现问题 1 的似然函数计算。此函数是求解问题的输入为w
: 正面朝上的概率;H
:正面朝上的次数;T
:反面朝上的次数。输出H+T次抛硬币,H次正面朝上,T次反面朝上的概率值。 -
step2 :补全
mle
函数代码。输入硬币1,2,3正面朝上的概率coin_1,coin_2,coin_3
, 正面朝上的次数h
, 反面朝上的次数t
。输出最大的概率值(保留3位小数)及硬币的编号(三枚硬币分别编号为coin_1 , coin_2 , coin_3
)。
测试输入:
0.34
0.5
0.67
49
31
预期输出:文章来源:https://www.toymoban.com/news/detail-492606.html
0.051
coin_3
代码:文章来源地址https://www.toymoban.com/news/detail-492606.html
from functools import reduce
coin_1 = float(input()) #硬币1正面朝上概率
coin_2 = float(input()) #硬币2正面朝上概率
coin_3 = float(input()) #硬币3正面朝上概率
h = int(input()) #正面朝上次数
t = int(input()) #反面朝上次数
# 实现概率计算
# 输入:w:正面朝上的概率 H:正面朝上的次数 T:反面朝上的次数
# 输出:H+T次抛硬币,H次正面朝上,T次反面朝上的概率值。
def calcu_prob(w,H,T):
########## Begin ##########
# 计算正反面组合数
c1=Factorial(H+T)
c2=Factorial(H)
c3=Factorial(T)
P=round((c1/c2/c3)*pow(w,H)*pow(1-w,T),3)
return P
########## End ##########
# 求正整数x的阶乘
# 输入:正整数x
# 输出:x的阶乘
def Factorial(x):
return reduce(lambda x, y: x * y, range(1, x + 1))
# 最大似然函数求解
# 输入: 硬币1,2,3正面朝上的概率coin_1,coin_2,coin_3, 正面朝上的次数h, 反面朝上的次数t
# 输出: 打印最大硬币的概率r与最大硬币的编号
def mle(coin_1,coin_2,coin_3,h,t):
########## Begin ##########
# 参考步骤
# 1. 计算三枚硬币各自的概率,保留三位小数
# 2. 建立硬币与概率的字典,方便索引
# 3. 选出最大值
# 4. 打印最大值
# 5. 通过字典索引打印硬币编号
a=calcu_prob(coin_1,h,t)
b=calcu_prob(coin_2,h,t)
c=calcu_prob(coin_3,h,t)
dit={a:"coin_1",b:"coin_2",c:"coin_3"}
print(max(a,b,c))
print(dit[max(a,b,c)])
########## End ##########
if __name__ == "__main__":
# 主函数执行
mle(coin_1,coin_2,coin_3,h,t)
到了这里,关于最大似然法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!