reflash. 2023-12-20 21:05 采纳率: 50%
浏览 11

贝叶斯公式经典黑白求问题的逆向推理

有没有带佬可以分享一下解题思路呀

箱子中黑球与白球总共3个,其中黑球的数量由用户输入来指定(0-3) ,现在每次从箱子中拿出两个,然后放回。假设不知道箱子中黑球的数量,只能看到每次取球的结果。Y是箱子中黑球的数量,开始时P(Y=i)=1/4,i=0,1,2,3。X是每次取出的黑球数量。每一次取球之后,根据结果x,使用贝叶斯公式计算

P(Y=i|X=x)=[P(X=x|Y=i)*P(Y=i)]/[∑j=0 3 P(X=x|Y=j)*P(Y=j)]

之后把这次计算结果的P(Y=i|X=x)作为下次输入的P(Y=i)。重复10次后,P(Y=i)最大的i是什么,概率是多少?用py程序模拟以上过程。
要点:
用程序计算P(X=x Y=i),i=0,1,2,3,用程序写出贝叶斯公式
正确模拟取球的过程
正确写出循环框架和更新数据
程序的稳定性和可读性

img

  • 写回答

1条回答

  • bluetata 云计算领域优质创作者 2023-12-21 19:10
    关注

    可以参考下思路,如果有错误可以一起讨论

    计算 P(X=x|Y=i):确定在给定箱子中黑球数量情况下,取出 x 个黑球的概率。
    模拟取球过程:模拟每次从箱子中取出两个球的过程。
    使用贝叶斯公式更新概率:根据贝叶斯公式更新每次取球后黑球数量的概率。
    循环框架和数据更新:使用循环进行10次取球,并更新每次取球后的概率。
    稳定性和可读性:编写清晰易读、结构良好的代码,并确保程序逻辑正确。
    以下是一个 Python 程序示例,模拟了这个过程:

    import numpy as np
    
    # 计算 P(X=x|Y=i)
    def calc_prob_x_given_y(x, y):
        if x == 0:
            if y == 0:
                return 1.0
            else:
                return 0.0
        elif x == 1:
            if y == 0:
                return 1 / 3
            elif y == 1:
                return 1 / 2
            elif y == 2:
                return 2 / 3
            else:
                return 1.0
        elif x == 2:
            if y == 0:
                return 2 / 3
            elif y == 1:
                return 1 / 2
            elif y == 2:
                return 1 / 3
            else:
                return 0.0
        elif x == 3:
            if y == 0:
                return 0.0
            else:
                return 0.0
    
    # 模拟取球过程
    def draw_balls(black_balls):
        balls = ['B'] * black_balls + ['W'] * (3 - black_balls)
        np.random.shuffle(balls)
        return balls[:2]
    
    # 初始化 P(Y=i)
    p_y_given_i = [1 / 4] * 4
    
    # 重复10次取球并更新概率
    for _ in range(10):
        drawn_balls = draw_balls(np.random.choice(4, p=p_y_given_i))
        black_count = drawn_balls.count('B')
        temp_p_y_given_i = [0] * 4
    
        for i in range(4):
            prob_x_given_y = calc_prob_x_given_y(black_count, i)
            temp_p_y_given_i[i] = prob_x_given_y * p_y_given_i[i]
    
        sum_prob = sum(temp_p_y_given_i)
        p_y_given_i = [prob / sum_prob for prob in temp_p_y_given_i]
    
    # 找到最大概率的 i 值和概率
    max_prob = max(p_y_given_i)
    max_i = p_y_given_i.index(max_prob)
    
    print(f"在10次模拟后,P(Y=i)最大的 i 值为 {max_i},概率为 {max_prob}")
    
    评论

报告相同问题?

问题事件

  • 创建了问题 12月20日

悬赏问题

  • ¥15 odoo17在制造模块或采购模块良品与次品如何分流和在质检模块下如何开发
  • ¥15 Qt音乐播放器的音乐文件相对路径怎么写
  • ¥15 VB.NET利用摄像头拍照的程序
  • ¥15 linux下vscode设置不了字连体
  • ¥20 游戏mod是如何制作的
  • ¥15 关于#hadoop#的问题:按照老师上课讲的步骤写的
  • ¥20 有人会用这个工具箱吗 付fei咨询
  • ¥30 成都市武侯区住宅小区兴趣点
  • ¥15 Windows软实时
  • ¥15 自有服务器搭建网络隧道并且负载均衡