《A First Course in Probability》-chaper3-条件概率和独立性-贝叶斯公式、全概率公式
设有事件A、B。
下面结合具体的题目进一步理解这种方法:
Q1:保险公司认为人可以分为两类,一类易出事故,另一类则不易出事故。统计表明,一个易出事故者在一年内发生事故的概率是0.4,而对不易出事故者来说,这个概率可以减小到0.2,若假定第一类人占人口比例的30%,现有一个新人来投保,那么该人在一年内出事故的概率有多大?
分析:这里我们要求解该人出事故的概率,那么设事件A是该人出事故。而对于事件B,我们当前有三种选择:
(1) 该人是易出事故为事件B1.
(2) 该人不是易出事故为事件B2.
(3) 该人未出事故为事件B3.
此时我们分别利用上文给出的贝叶斯公式代入计算,此时会发现,(1)(2)的结果是相同的,但是对于(3),我们最终将会推出P(A) = P(A)。而我们很容易看到的一点是,B1、B2和A均是相交集合,而B3则与A是互斥集合。这告诉我们,在应用贝叶斯公式的时候求解事件A的概率时,所选取的第二个事件B应该是与事件A相交的。
本质上讲,所谓的全概率公式、贝叶斯公式就是基于独立性的定义和基本的组合原理,将问题进一步程度的抽象。
全概率公式:
贝叶斯公式:
Ex1:
考虑n张含有一张黑桃“A”的扑克,从第一张扑克开始翻牌,游戏者只有一次猜测机会,可以选择第i次翻牌猜测这张牌是否是黑桃“A”,那么游戏者采取这样的策略能够让获胜几率更大呢?
分析:要解决这个问题,分别讨论第i次猜牌胜利的几率即可
Ex2:
在回答一道多项选择问题时,学生或者知道正确答案,或者就猜一个。令p表示他知道正确答案的概率,则1-p表示猜的概率。假定学生猜中正确答案的概率为1/m,m就是多项选择题的可选答案数。在已知他回答正确的条件下,该学生知道正确答案的概率是多少?
分析:这是比较典型的贝叶斯公式的应用了,时空上应该知道正确答案然后回答正确,但是现在反过来,正是贝叶斯公式能够处理的。
Ex3:一项血液化验有95%的把我诊断某种疾病,但是,这项化验用于健康人也会有1%的“伪阳性”结果(即如果一个健康人接受这项化验,则化验结果乌镇此人患有该疾病的概率是0.01)。如果该疾病的患者事实上只占总人口的0.5%,若某人化验结果为阳性,则此人确实患疾病的概率是多少?
分析:单从问题来看,一般的时空逻辑是像得病,然后化验成阳性,现在的问题变成了已经成阳性,反过来问你真的患病的概率,能够看到是典型的贝叶斯公式的应用。
ACM中的概率问题主要涉及到基本的概率公式(全概率、条件概率),然后可能基于递推的思路去解决问题(概率dp),也可能用到数学期望以及一些组合数学中的结论。
Ex4:决斗(uva 1636).
首先在手枪里随机装一些子弹,然后打了一枪,发现没有子弹。你希望下一枪也没有子弹,是应该直接再开一枪(输出SHOOT),还是转一下再开(输出ROTATE)?如果两种策略下没有子弹的概率相等,输出EQUAL。
手枪里的子弹看成一个环形序列,开枪一次对准下一个位置。例如,子弹序列为0011,第一次开枪一定在位置1或2,因此开枪之后位置位于2或3.
分析:很典型的数学问题,解决思维层面在编程计算上几乎没有什么难度。我们分别来看两种策略下没子弹的概率。
对于直接再打一枪,能够看到它是基于第一枪打孔的条件概率,它的计算方法应该是环形01串中”00”的数量除以”00”、”01”的数量之和,后者其实本质上是整个串中0的数量。
对于转一下再开枪,这一枪打孔的概率就是0的比率。
设a是环形01串中“00”个个数,b是“0”的个数,比较a/b和b/n(字符串长)的大小即可。
Ex5:麻球。 (uva 11021)
题目大意:每个麻球的生存周期是一天,一天结束后它可能繁殖出[0,n-1]个麻球,它们的概率分别是P[0]~P[i-1],那么起初k个麻球,在前m天全部死亡的概率是(包括不足m天就死亡的)?
分析:由各个麻球的独立性,我们其实只需要求解一个麻球进行繁殖,在前m天就全部死亡的概率,假设记为f[m],那么最终结果就是f[m]的k次方.
那么下面我们面临的问题变成了如何求解f[m]。
这里就要用到全概率公式,或者理解成动态规划也可以。这里我们通过概率的角度去解释。
因此我们容易得到如下的递推关系式.
简单的参考代码如下:
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std; const int maxn = + ;
const int maxm = + ; int n , k , m;
double P[maxn] , f[maxm]; int main()
{
int T;
int tt = ;
scanf("%d",&T);
while(T--)
{
memset(f , , sizeof(f));
scanf("%d%d%d",&n,&k,&m);
for(int i = ;i < n;i++)
scanf("%lf",&P[i]); f[] = P[];
for(int i = ;i <= m;i++)
{ for(int j = ;j < n;j++)
f[i] += P[j]*pow(f[i-],j);
} printf("Case #%d: %.7lf\n",tt++ , pow(f[m],k));
}
return ;
}
Ex6:蒙提霍尔问题的推广(uva 10491).
这个问题以蒙提霍尔问题为背景。笔者在《Numberical Methods》的专栏中曾经介绍过,这里将牛、车、主持人打开的门的数量分别记为a、b、c,那么请问在玩家选择了一个门之后,主持人打开c个门后是牛的门,玩家总是采取换门策略的情况下,抽中车的概率。
利用简单的全概率公式即可。
Uva11181:
给出n个人买东西的概率,n个人之见是否买东西是独立的 ,现在问在n个人中k个人买东西的情况下,第i个人买了东西的概率是多少。
分析:设n个人中k个人买了东西为事件E,第i个人买了东西的事件是Ei,那么根据条件概率的概念,这道问题即是求P(Ei|E)=P(EEi) / P(E)
现在的问题在于,如何编程计算P(E)和P(EEi),这是一个基于dfs的基本的生成组合的问题。我们即将买的人标记为1,没买的标记为0.
P(E)需要求出总长为n的01序列中含有k个1的所有序列,然后对应着得到概率,累加之后得到P(E).
P(EEi)则是求出长度为n的01序列中k个1但是第i个必须是1的所有序列,然后得到对应的概率和,得到P(EEi).
然后二者相除得到最终的结果。
参考代码如下:
#include<cstdio>
#include<cstring>
using namespace std; const int maxn = ;
double pro[maxn];
int visit[maxn];
int n , k;
double pa , pb;
double temp; void dfs(int num , int now)
{
if(num == k)
{
double p = 1.0;
for(int i = ;i < n;i++)
{
if(visit[i]== ) p *= pro[i];
//printf("%d",visit[i]);
else p *= ( - pro[i]);
} temp += p;
} for(int i = now + ;i < n;i++)
{
if(!visit[i])
{
visit[i] = ;
dfs(num + , i);
visit[i] = ; } } } int main()
{
int tt = ;
while(scanf("%d %d",&n,&k) &&(n || k))
{
printf("Case %d:\n",tt++);
for(int i = ;i < n;i++)
scanf("%lf",&pro[i]);
temp = 0.0;
dfs( , -);
pa = temp;
//printf("%lf ",pa); for(int i = ;i < n;i++)
{
visit[i] = ;
temp = 0.0;
dfs( , -);
pb = temp;
//printf("%lf ",pb); printf("%.6lf\n",pb/pa);
visit[i] = ; } }
}
《A First Course in Probability》-chaper3-条件概率和独立性-贝叶斯公式、全概率公式的更多相关文章
- Uva - 11181 Probability|Given (条件概率)
设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西. 那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同 ...
- NLP&数据挖掘基础知识
Basis(基础): SSE(Sum of Squared Error, 平方误差和) SAE(Sum of Absolute Error, 绝对误差和) SRE(Sum of Relative Er ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门
1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生,要么不发生,从来不会去考虑某件事情发生的概率有多大,不发生的概率又是多大.而且概率虽然未知,但最起码是一个确定 ...
- 常见的机器学习&数据挖掘知识点
原文:http://blog.csdn.net/heyongluoyao8/article/details/47840255 常见的机器学习&数据挖掘知识点 转载请说明出处 Basis(基础) ...
- AI人工智能专业词汇集
作为最早关注人工智能技术的媒体,机器之心在编译国外技术博客.论文.专家观点等内容上已经积累了超过两年多的经验.期间,从无到有,机器之心的编译团队一直在积累专业词汇.虽然有很多的文章因为专业性我们没能尽 ...
- 贝叶斯公式由浅入深大讲解—AI基础算法入门【转】
本文转载自:https://www.cnblogs.com/zhoulujun/p/8893393.html 1 贝叶斯方法 长久以来,人们对一件事情发生或不发生的概率,只有固定的0和1,即要么发生, ...
- 学习AI之NLP后对预训练语言模型——心得体会总结
一.学习NLP背景介绍: 从2019年4月份开始跟着华为云ModelArts实战营同学们一起进行了6期关于图像深度学习的学习,初步了解了关于图像标注.图像分类.物体检测,图像都目标物体检测等 ...
- 【概率论】3-6:条件分布(Conditional Distributions Part II)
title: [概率论]3-6:条件分布(Conditional Distributions Part II) categories: Mathematic Probability keywords: ...
- MAP;MLE
判别学习算法:直接对问题进行求解,比如二分类问题,都是在空间中寻找一条直线从而把类别的样例分开,对于新的样例只要判断在直线的那一侧就可. ==>这种直接求解的方法称为判别学习方法 生成学习算法: ...
随机推荐
- 学习java随笔第一篇:搭建java平台(java se)
电脑系统:windows8 在这里介绍一下java平台的3个版本: Java SE--Java Standard Edition,Java的标准版,主要用于桌面级的应用和数据库开发. Java EE- ...
- 使用EasyUI设计.net项目的菜单数实例
最近领导说我们之前的项目采用的菜单树模型过时了,现在采用EasyUI来设计了,于是学习了第三方资源库easyUI,发觉果然是好东西,这里给大家分享下. 首先到官网下载源文件,这个是开源的,都可以下再, ...
- 1.PhotoShop缩小图片的三种方式
先声明,本人不是高前端的,若有不当或者不合理的地方,还望前端爱好者多多指教.此处只是留作个人记录备忘. PS中有三种缩小 1.视图缩小,那方法很多缩放工具.Ctrl+"-",导航器 ...
- 共享受限资源,Brian的同步规则
说明:如果一个变量是boolean,则此变量是原子性的,即赋值和返回值简单的操作在发生时没有中断的可能. 递增不是原子性炒作. 解决共享资源竞争: 1. 通过加锁,锁语句会产生相互排斥的效果,此种机制 ...
- UITextView/UITextField检测并过滤Emoji表情符号
UITextView/UITextField检测并过滤Emoji表情符号 本人在开发过程中遇到过这种情况,服务器端不支持Emoji表情,因此要求客户端在上传用户输入时,不能包含Emoji表情.在客户端 ...
- 狗狗40题~(Volume B)
H - Sorting Slides 应该是个二分匹配的模板题的,但我还不会写 = = 其实数据规模很小,就用贪心的方法就水过了(没加vis判冲突wa了几发,从此开始艰难的没有1A 的生活) #inc ...
- SGU 115.Calendar
连水3道,还能更水么... #include <stdio.h> using namespace std; ] = {, , , , , , , , , , , , }; int n, m ...
- .NET Framework(二)
在上一篇的随笔中,我们在理论层面上大致说明了.NET Framework的工作机制,内容的确比较晦涩难懂,但是还是希望大家有时候可以看看.我个人觉得,编程不是一味的敲代码,当自己遇到瓶颈的时候,可以多 ...
- delegate 中的BeginInvoke和EndInvoke方法
开发语言:C#3.0 IDE:Visual Studio 2008 一.C#线程概述 在操作系统中一个进程至少要包含一个线程,然后,在某些时候需要在同一个进程中同时执行多项任务,或是为了提供程序的性能 ...
- 关于点击空白关闭弹窗的js写法推荐?
$(document).mouseup(function(e){ var _con = $(' 目标区域 '); // 设置目标区域 ){ // Mark 1 some code... // 功能代码 ...