今天的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(A∣B)=0.2,P(A∣Bˉ)=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(B∣A)=P(B)P(A∣B)+P(Bˉ)P(A∣Bˉ)P(B)P(A∣B)=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);
}
}
运行结果如下:
由此可见,一个人的行为确实会不断修正其他人对其的看法。
参考文章:如何用贝叶斯公式计算“狼来了”中村民对小孩的信任程度
如发现本文中的问题,请联系我,我将不胜感激,并将问题加以改正。