贝叶斯:起步(4/4),三人成虎吗?(附代码)

概率论(英语:Probability theory)是研究概率、随机性及不确定性等现象的数学分支,而贝叶斯学派(Bayesians)又是其中有代表性的流派。每周四更新,本文为贝叶斯系列文章第 4 期,再用一个生活中的例子感受下贝叶斯公式的力量。贝叶斯:起步(4/4),三人成虎,很有意思的例子(附代码)

文章来自微信公众号“科文路”,欢迎关注、互动。转载须注明出处。

上周四,我们通过一个例子认识了贝叶斯公式的力量,

$$
P(A\mid B)={\frac {P(A)P(B\mid A)}{P(B)}}
$$

这个公式还有一个略显复杂的版本,长这样,

$$
P(A_i\mid B)={\frac {P(A_i)P(B\mid A_i)}{\sum_{j=1}^{\infty}P(A_j)P(B\mid A_j)}}
$$

这个公式可以这么理解:$A_j$ 是一系列事件,所有这些事件构成了完整的 $A$ 事件,$A_i$ 是其中一个我们想研究的特定事件。比如,

勘误

上一篇文章中的 $P(A)=P(A\mid C_\text{box1}) + P(A\mid C_\text{box2})$ 虽然算的是对的,但实际上应该如上面的分母那样表示为 $P(A)=P(C_\text{box1})P(A\mid C_\text{box1}) + P(C_\text{box2})P(A\mid C_\text{box2})$

实例一:三人成虎

问题:你问三个人一件事的真实性,每个人给你的答复都有说谎的可能性。请问,如果三人都说某个事是真的,这个答案的实际真实性如何?

列出贝叶斯公式,

$$
P(A_1\mid B)={\frac {P(A_1)P(B\mid A_1)}{\sum_{j=1}^{2}P(A_j)P(B\mid A_j)}}
$$

关注贝叶斯公式右边,

  • 某事件为真($A_1$)的概率为 $P(A_1)=x$,这将会是一个先验概率;
  • 某事件为假($A_2$)的概率为 $P(A_2)=1-x$;
  • 考虑三人成虎,三人都说一件事为真 $P(B)$ 的概率,只有两种情况,
    • $P(A_1)P(B\mid A_1)$,事件为真($A_1$)时,三个朋友都说该事件为真($B$)的概率为 $y^3x$;
    • $P(A_2)P(B\mid A_2)$,也就是说谎话,事件为假($A_2$)时,三个朋友还说该事件为真($B$)的概率为 $(1-y)^3(1-x)$

代入公式,

$$
P(A_1\mid B)=\frac{y^3x}{y^3x+(1-y)^3(1-x)}
$$

实例

例如,老家下雨的概率为 0.5,我问了 3 个人,他们都说现在老家确实正在下雨,而这 3 个人说谎的可能性是 0.3,请问确实在下雨的概率是多少?

代入 $x=0.5, y=0.7$,

$$
P(确实下雨\mid 三人说下雨)= \frac{0.1715}{0.1715+0.0135}=0.927
$$

显然,这比我们事先得到的 0.5 的先验概率要高的多,所以这种情况下三人并不成虎

另一个角度:问的人越多,答案越真实吗

进一步看上面这个公式,我们思考,如果生活中都是这样的人,我们求证一件事情的时候,是问的人越多越好吗?

很简单,我们看这贝叶斯公式:

$$
P(A_1\mid B)=\frac{y^3x}{y^3x+(1-y)^3(1-x)}
$$

再抽象一下,

  • 认为每个人的诚实度都一样,为$y$
  • 认为事情发生的先验概率,也就是历史总结出来的概率,为 $x$

再确定“三人成虎”

画出 xy 的关系 f(x,y) = (x*y**3)/(x*y**3+(1-x)*(1-y)**3)-x,也就是看着两个因素对于事情可信度提升的影响,

角度 1 - 看 x y 的趋势

角度 2 - 看 y=0.5 上的分界

可以从图中观察到一些重要的信息,

  • y>0.5 时,即人们比较诚实时
    • x越小,z越大
    • 也就是说,先验概率发生概率越小,通过问人得到肯定答复,可以得到更高的可信度
  • y<0.5 时,即人们不诚实时
    • x越大,|z| 越大
    • 也就是说,如果这些人平时就喜欢撒谎,那一件事发生的可能性越大,你从这些人口中得到肯定答复后,这件事的可信度反而更低

总的来说,选择诚实的人去问问题,得到正面答复后,这事的可信度会更高。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Import the necessary modules
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Define the function to plot
def f(x, y):
return (x*y**3)/(x*y**3+(1-x)*(1-y)**3)-x

# Create a grid of x and y values
x = np.linspace(0, 1, 50)
y = np.linspace(0, 1, 50)
x, y = np.meshgrid(x, y)

# Compute the z values
z = f(x, y)

# Create a figure and an axes object
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Plot the surface
ax.plot_surface(x, y, z, cmap='viridis')

# Add labels and title
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('Surface plot of f(x,y) = (x*y**3)/(x*y**3+(1-x)*(1-y)**3)-x')

# Add a plate as x=z
x2 = x # Use z as the x values for the plate
y2 = y # Use y as the y values for the plate
z2 = np.zeros_like(x2) # Use zeros as the z values for the plate
ax.plot_surface(x2, y2, z2, color='red', alpha=0.5) # Plot the plate with red color and transparency

# Show the plot
plt.show()

~~

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

至少点个赞再走吧~

贝叶斯:起步(4/4),三人成虎吗?(附代码)

https://xlindo.com/kewenlu2023/posts/44a806d8/

Author

xlindo

Posted on

2023-09-21

Updated on

2024-01-16

Licensed under

Comments