
使用numpy实现期望极大(EM)算法
发布日期:2021-05-04 18:12:41
浏览次数:19
分类:技术文章
本文共 1359 字,大约阅读时间需要 4 分钟。
实现用例为李航统计学习方法第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()
发表评论
最新留言
不错!
[***.144.177.141]2025年03月21日 16时05分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
VTK:InfoVis之DelimitedTextReader
2019-03-03
CCF 201912-1 报数 满分代码
2019-03-03
CCF 201912-2 回收站选址 满分代码
2019-03-03
基于DFA算法实现文章敏感词过滤
2019-03-03
Git commit代码后撤销方法
2019-03-03
数据结构与算法学习1-----稀疏数组
2019-03-03
java手动实现JWT(我和别人的不一样)
2019-03-03
LetCode刷题记录--No3-无重复字符的最长子串
2019-03-03
Java转换xml格式时间 (yyyy-MM-ddTHH:mm:ss.SSSZ)
2019-03-03
Python 使用 __getstate__ 和 __setstate__ 魔法方法
2019-03-03
ts从入门到进阶—4.2类
2019-03-03
hook钩子介绍
2019-03-03
关于json
2019-03-03
字符串详解
2019-03-03
焦点事件
2019-03-03
webpack打包常见报错
2019-03-03
微信小程序--08数据与列表渲染
2019-03-03
微信小程序--11事件
2019-03-03
vuex—1vuex初始
2019-03-03
axios服务器通信—1axios介绍和使用mock数据
2019-03-03