贝叶斯公式与随机点名中的学生可信度

  今天的Java上机练习有一道非常有意思的题:

使用贝叶斯公式求解,随机点名多少次,学生的可信度降到了0.01以下,该同学需要经过多少次,可信度才能上升到0.85。 假定初始同学可信的概率是0.8,可信同学上课的概率是0.8,不可信同学上课的概率是0.4,请编写程序求解上述问题。

  贝叶斯分析作为一个统计学的基本流派,通过先验和条件概率的结合,可以综合已有过往人类对一个领域的知识和更新的数据,来不停改进人类的认知。即一个人的行为会不断修正其他人对其的看法。
  相信大家都听过“狼来了”的故事,而这道题和“狼来了”非常类似。在这道题目的背景下,学生有两种行为,即去上课和不去上课;老师也有两种行为,即信任这个学生或不信任这个学生。我们不妨设事件 A A A表示学生不来上课,事件 B B B表示学生可信。那么根据题意,有 P ( B ) = 0.8 , P ( B ˉ ) = 0.2. P(B)=0.8,P(\bar B)=0.2. P(B)=0.8,P(Bˉ)=0.2.在计算修正后的学生可信度时,我们需要知道可信的学生不来上课的概率,以及不可信的学生不来上课的概率,即 P ( A ∣ B ) = 0.2 , P ( A ∣ B ˉ ) = 0.6. P(A|B)=0.2,P(A|\bar B)=0.6. P(AB)=0.2,P(ABˉ)=0.6.那么,当可信的学生第一次不来上课时,他的可信度修正为 P ( B ∣ A ) = P ( B ) P ( A ∣ B ) P ( B ) P ( A ∣ B ) + P ( B ˉ ) P ( A ∣ B ˉ ) = 0.8 × 0.2 0.8 × 0.2 + 0.2 × 0.6 = 4 7 . P(B|A)=\frac{P(B)P(A|B)}{P(B)P(A|B)+P(\bar B)P(A|\bar B)}=\frac{0.8\times0.2}{0.8\times0.2+0.2\times0.6}=\frac{4}{7}. P(BA)=P(B)P(AB)+P(Bˉ)P(ABˉ)P(B)P(AB)=0.8×0.2+0.2×0.60.8×0.2=74.
也就是说,可信的学生第一次不来上课,他的可信度就会从原先的0.8下降到0.57左右。当他后续多次不来上课时,他的可信度就会越来越低。

double b = 0.8;        // 学生可信
double b_ = 0.2;       // 学生不可信
double ab = 0.2;       // 学生可信但未上课
double ab_ = 0.6;      // 学生不可信且未上课
double a_b = 0.8;      // 学生可信且上课
double a_b_ = 0.4;     // 学生不可信但上课

// 随机点名多少次,学生的可信度降到了0.01以下
int cnt1 = 0;
while (b >= 0.01) {
    b = (b * ab) / (b * ab + b_ * ab_);
    b_ = 1 - b;
    cnt1++;
}
System.out.println("随机点名" + cnt1 + "次,学生的可信度降到了0.01以下");
System.out.println("此时学生的可信度为" + b);

  通过编写程序,我们可以得知,当学生连续6次不来上课时,他的可信度就会从0.8降到0.01以下。
在这里插入图片描述

  同样的道理,如果他后续来上课,那么老师对他的可信度就会不断提高。下面是解决本道题目后半个问题的代码:

// 该同学需要经过多少次,可信度才能上升到0.85
int cnt2 = 0;
while (b < 0.85) {
    b = (b * a_b) / (b * a_b + b_ * a_b_);
    b_ = 1 - b;
    cnt2++;
}
System.out.println("该同学需要经过" + cnt2 + "次,可信度才能上升到0.85");
System.out.println("此时学生的可信度为" + b);

在这里插入图片描述

  下面是解决本题的完整代码:

package JavaProgramming_B;

public class Experiment_2_4 {
    public static void main(String[] args) {
        double b = 0.8;        // 学生可信
        double b_ = 0.2;       // 学生不可信
        double ab = 0.2;       // 学生可信但未上课
        double ab_ = 0.6;      // 学生不可信且未上课
        double a_b = 0.8;      // 学生可信且上课
        double a_b_ = 0.4;     // 学生不可信但上课

        // 随机点名多少次,学生的可信度降到了0.01以下
        int cnt1 = 0;
        while (b >= 0.01) {
            b = (b * ab) / (b * ab + b_ * ab_);
            b_ = 1 - b;
            cnt1++;
        }
        System.out.println("随机点名" + cnt1 + "次,学生的可信度降到了0.01以下");
        System.out.println("此时学生的可信度为" + b);

        // 该同学需要经过多少次,可信度才能上升到0.85
        int cnt2 = 0;
        while (b < 0.85) {
            b = (b * a_b) / (b * a_b + b_ * a_b_);
            b_ = 1 - b;
            cnt2++;
        }
        System.out.println("该同学需要经过" + cnt2 + "次,可信度才能上升到0.85");
        System.out.println("此时学生的可信度为" + b);
    }
}

  运行结果如下:
在这里插入图片描述

  由此可见,一个人的行为确实会不断修正其他人对其的看法。


参考文章:如何用贝叶斯公式计算“狼来了”中村民对小孩的信任程度
如发现本文中的问题,请联系我,我将不胜感激,并将问题加以改正。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值