编程要求
根据提示,在右侧编辑器补充 Begin-End 段中的代码,完成 em_single(priors, observations)
函数。该函数需要完成的功能是模拟抛掷硬币实验并估计在一次迭代中,硬币 A 与硬币 B 正面朝上的概率。其中:
-
init_values :硬币 A 与硬币 B 正面朝上的概率的初始值,类型为 list ,如 [0.2, 0.7] 代表硬币 A 正面朝上的概率为 0.2,硬币 B 正面朝上的概率为 0.7。
-
observations :抛掷硬币的实验结果记录,类型为 list 。 list 的行数代表做了几轮实验,列数代表每轮实验用某个硬币抛掷了几次。 list 中的值代表正反面,0 代表反面朝上,1 代表正面朝上。如 [[1, 0, 1], [0, 1, 1]] 表示进行了两轮实验,每轮实验用某硬币抛掷三次。第一轮的结果是正反正,第二轮的结果是反正正。
-
返回值:将估计出来的硬币 A 和硬币 B 正面朝上的概率组成 list 返回。如 [0.4, 0.6] 表示你认为硬币 A 正面朝上的概率为 0.4,硬币 B 正面朝上的概率为 0.6。
测试说明
平台会对你编写的代码进行测试,你只需完成 em_single 函数即可。
测试输入:
{'init_values':[0.2, 0.7], 'observations':[[1, 1, 0, 1, 0], [0, 0, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 0, 1, 1], [0, 1, 1, 0, 0]]}
预期输出: [0.346548, 0.528706]
import numpy as np
from scipy import stats
def em_single(init_values, observations):
"""
模拟抛掷硬币实验并估计在一次迭代中,硬币A与硬币B正面朝上的概率
:param init_values:硬币A与硬币B正面朝上的概率的初始值,类型为list,如[0.2, 0.7]代表硬币A正面朝上的概率为0.2,硬币B正面朝上的概率为0.7。
:param observations:抛掷硬币的实验结果记录,类型为list。
:return:将估计出来的硬币A和硬币B正面朝上的概率组成list返回。如[0.4, 0.6]表示你认为硬币A正面朝上的概率为0.4,硬币B正面朝上的概率为0.6。
"""
#********* Begin *********#
observations = np.array(observations)
counts = {'A': {'H': 0, 'T': 0}, 'B': {'H': 0, 'T': 0}}
theta_A = init_values[0]
theta_B = init_values[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]
#********* End *********#
标签:EM,迭代,硬币,正面,num,theta,counts,单次,朝上
From: https://blog.csdn.net/qq_64884115/article/details/139603296