使用numpy实现期望极大(EM)算法

实现用例为李航统计学习方法第155页例9.1

import numpy as np
"""
通过期望极大算法计算三硬币模型
"""

obs_arr = np.array([1, 1, 0, 1, 0, 0, 1, 0, 1, 1])
num = len(obs_arr)
para_init = {"π":0.4, "p":0.6, "q":0.7}


'''E步,计算在模型参数π、p、q下观测数据y来自掷硬币B的概率'''
def e_func():
    u_j_i_b_arr = np.array([])
    for y_index in obs_arr:
        u_j_i_b = para_init["π"] * pow(para_init["p"], y_index) * pow((1 - para_init["p"]), (1 - y_index))
        u_j_i_c = (1 - para_init["π"]) * pow(para_init["q"], y_index) * pow((1 - para_init["q"]), (1 - y_index))
        u_j_i_b = u_j_i_b / (u_j_i_b + u_j_i_c)
        u_j_i_b_arr = np.append(u_j_i_b_arr, u_j_i_b)
    return u_j_i_b_arr

'''M步,计算模型参数的新估计值'''
def m_func():
    iter_num = 0
    while True:
        π = np.cumsum(e_func())[-1] / num
        # print(π)
        p = np.cumsum(e_func() * obs_arr)[-1] / np.cumsum(e_func())[-1]
        # print(p)
        q = np.cumsum((1 - e_func()) * obs_arr)[-1] / np.cumsum(1 - e_func())[-1]
        # print(q)
        if para_init["π"] == π and para_init["p"] == p and para_init["q"] == q:
            break
        else:
            para_init["π"] = π
            para_init["p"] = p
            para_init["q"] = q
        iter_num +=1
    print("硬币A、B、C正面出现的概率(参数估计值)分别为:")
    print(format(para_init["π"], '.4f'), format(para_init["p"], '.4f'), format(para_init["q"], '.4f'))
    print("迭代的次数:", iter_num)
    
if __name__ == "__main__":
    m_func()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrystalheartLi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值