[转载]贝叶斯概率公式应用一——狼来了问题

标签:
转载 |
分类: 教育 |
问题描述:
狼来了问题:
合理假设:
(1)村民初始对小孩的信任度为0.8;
(2)可信的小孩说谎的可能性为0.1;
(3)不可信的小孩说谎的可能性为0.5;
小孩说两次谎后,他的可信度变为0.138,求如果这个孩子要改邪归正,他需要多少次才能把信任度提高到80%?
二、实验数据说明
1.
事件 |
P(B) |
P(A/B) |
P(A/B*) |
概率 |
0.138 |
0.1 |
0.5 |
事件 |
P(B*) |
P(A*/B) |
P(A*/B*) |
概率 |
1-0.138 |
1-0.1 |
1-0.5 |
三、解决方案:
使用语言:python
原理:贝叶斯概率
思路:小孩不说谎后,使用贝叶斯概率公式,计算小孩每次真话后的可信度,记录小孩可信度首次超过0.8时的计算次数,即为结果。
步骤:
$1.设小孩当前的可信度P(B)为0.138,次数为0;
$2.使用贝叶斯概率公式
P(B/A*)=P(A*/B)*P(B)/(P(A*/B)*P(B)+P(A*/B*)*P(B*))
$3.如果P(B)>=0.8,记录次数,结束;否则,执行$2.
四、结果如下:
(1)
说谎次数 |
1 |
2 |
3 |
4 |
5 |
可信度P(B) |
0.4444 |
0.1379 |
0.0310 |
0.0064 |
0.0013 |
表1.1
(2)
说谎次数 |
1 |
2 |
3 |
4 |
5 |
可信度P(B) |
0.2237 |
0.3415 |
0.4828 |
0.6294 |
0.7516 |
说谎次数 |
6 |
7 |
8 |
9 |
10 |
可信度P(B) |
0.8448 |
0.9074 |
0.9464 |
0.9695 |
0.9828 |
表1.2
(3)
图1.1
结论:从表1.2可以看出,小孩改邪归正后,连续不说谎6次后的可信度可以达到0.8448,首次超过0.8。
python代码
import numpy as np;
import matplotlib.pyplot as plt;
def confidence_p_b_a(p_b,p_a_b,n):
#计算小孩说n次谎话,每次说谎后的可信度;
res=[];
i=1;
while i<=n:
p_a = np.multiply(p_b, p_a_b);
sum = np.sum(p_a);
p = p_a[0] / sum;
res.append(p)
#更新先验概率;
p_b=([p,1-p]);
i+=1;
return res;
def confidence_and_times(p_b,p_a1_b,n,pl):
#计算小孩说n次不说谎话,每次不说谎后的可信度;
res1=[];
i=1;
while i<=n:
p_a = np.multiply(p_b, p_a1_b);
sum = np.sum(p_a);
p = p_a[0] / sum;
#times记录最后一次可信度小于pl的不说谎的次数;
if p< pl:
times=i;
res1.append(p)
#更新先验概率;
p_b=([p,1-p]);
i+=1;
return res1,times;
p_b=([0.8,0.2]);
p_a_b=([0.1,0.5]);
ax1=plt.subplot(121);
res=confidence_p_b_a(p_b,p_a_b,10);
plt.plot(np.arange(1,len(res)+1,1),res,'*-g')
plt.xlabel(u'说谎次数',fontproperties='SimHei');
plt.ylabel(u'可信度',fontproperties='SimHei');
ax1.set_title(u'小孩说谎后的可信度',fontproperties='SimHei');
print(res)
p_b2=([0.138,1-0.138]);
p_a1_b2=([1-0.1,1-0.5]);
[res1,times]=confidence_and_times(p_b2,p_a1_b2,10,0.8);
print('小孩',times+1,'次不说谎后的可信度首次超过0.8,可信度为:',res1[times]);
print(res1)
ax2=plt.subplot(122);
plt.plot(np.arange(1,len(res1)+1,1),res1,'*-b');
plt.plot(times+1,res1[times],'or');
plt.annotate(u'小孩可信度高于0.8',xy=(times+1,res1[times]),xytext=(times+1-0.2,res1[times]-0.2),arrowprops=
dict(facecolor='red',shrink=0.1,width=1),fontproperties='SimHei');
plt.xlabel(u'不说谎次数',fontproperties='SimHei');
plt.ylabel(u'可信度',fontproperties='SimHei');
ax2.set_title(u'小孩不说谎后的可信度',fontproperties='SimHei');
#plt.legend(prop={'family':'SimHei','size':15})#显示中文;
plt.show();