概述
reference:https://blog.csdn.net/sinat_36811967/article/details/79801095
# -*- coding:utf-8 -*-
# https://blog.csdn.net/sinat_36811967/article/details/79801095
from __future__ import print_function
# 知道投掷的是a或b,求Coin a和b投掷结果是head的最大似然估计,用来评估EM算法
MLE_a = 24.0 / (24 + 6)
MLE_b = 9.0 / (9 + 11)
print("real:", MLE_a, MLE_b)
# 不知道投掷的是a还是b,用EM算法估计
# init
init_a = 0.6
init_b = 0.5
h1, t1 = 5, 5
h2, t2 = 9, 1
h3, t3 = 8, 2
h4, t4 = 4, 6
h5, t5 = 7, 3
list_h = [h1, h2, h3, h4, h5]
list_t = [t1, t2, t3, t4, t5]
iter_times = 20
for i in range(iter_times):
"""
E-step
假设为a,则出现该结果的概率为init_a的出现正的次数方乘以(1-init_a)的出现负的次数方
假设为b,则出现该结果的概率为init_b的出现正的次数方乘以(1-init_b)的出现负的次数方
归一化后乘以真实数据中的正负数可以分别得到a,b中的正负数的估计值
"""
result_list = []
for j in range(len(list_h)):
prob_a = pow(init_a, list_h[j])*pow(1-init_a, list_t[j])
prob_b = pow(init_b, list_h[j])*pow(1-init_b, list_t[j])
count_a_h = list_h[j] * prob_a/(prob_a + prob_b)
count_a_t = list_t[j] * prob_a/(prob_a + prob_b)
count_b_h = list_h[j] * prob_b/(prob_a + prob_b)
count_b_t = list_t[j] * prob_b/(prob_a + prob_b)
# print(count_a_h, count_a_t, count_b_h, count_b_t)
result_list.append([count_a_h, count_a_t, count_b_h, count_b_t])
"""
M-step
用当前结果更新参数init_a,init_b
"""
sum_ah, sum_at, sum_bh, sum_bt = 0, 0, 0, 0
for one_list in result_list:
sum_ah += one_list[0]
sum_at += one_list[1]
sum_bh += one_list[2]
sum_bt += one_list[3]
init_a = sum_ah / (sum_ah + sum_at)
init_b = sum_bh / (sum_bh + sum_bt)
print(i+1, init_a, init_b)
通过实验可以得到:
当初始化init_a = init_b时,最终结果均为0.66;
当init_a > init_b时,最终结果会收敛到0.8,0.52;
当init_a < init_b时,最终结果会收敛到0.52,0.8。
最后
以上就是秀丽月饼为你收集整理的简单EM算法python实现的全部内容,希望文章能够帮你解决简单EM算法python实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复