新浪博客

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

2017-11-16 22:05阅读:
贝叶斯概率公式应用一——狼来了问题 问题描述:
狼来了问题:
合理假设:
(1)村民初始对小孩的信任度为0.8
(2)可信的小孩说谎的可能性为0.1
(3)不可信的小孩说谎的可能性为0.5
小孩说两次谎后,他的可信度变为0.138,求如果这个孩子要改邪归正,他需要多少次才能把信任度提高到80%
二、实验数据说明
1. 实验数据
a.事件A表示“小孩说谎”,用事件A*表示“小孩不说谎”;

b.事件B表示“小孩可信”,用事件A*表示“小孩不可信”;
事件
P(B)
PA/B
PA/B*
概率
0.138
0.1
0.5
事件
P(B*)
PA*/B
PA*/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*))
求小孩不说谎后的可信度;次数加一,小孩当前的可信度为P(B)=P(B/A*);
$3.如果P(B)>=0.8,记录次数,结束;否则,执行$2.
四、结果如下:
(1) 1.1列出了小孩初始可信度为0.8时,小孩说谎5次,每次说谎后的可信度;
说谎次数
1
2
3
4
5
可信度P(B)
0.4444
0.1379
0.0310
0.0064
0.0013
1.1
(2) 1.2表示小孩连续说谎2次后,可信度为0.138时,小孩连续不说谎十次,每次不说谎后的可信度;
说谎次数
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左图显示了小孩说谎后的可信度的变化情况,右图显示了连续不说谎10次的可信度的变化情况;x轴表示不说谎次数,y轴表示可信度。
贝叶斯概率公式应用一——狼来了问题
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();

我的更多文章

下载客户端阅读体验更佳

APP专享