决策论——贝叶斯后验概率R实现(一)

贝叶斯理论是决策领域的一个重要分支,属于风险型决策的范畴。风险型决策的基本方法是将状态变量看成随机变量,用先验分布表示状态变量的概率分布,用期望值准则计算方案的满意程度。但是在日常生活中,先验分布往往存在误差,为了提高决策质量,需要通过市场调查来收集补充信息,对先验分布进行修正,然后用后验分布来决策,这就是贝叶斯决策。

一、贝叶斯应用示例

先验概率: 一所学校里面有 60% 的男生,40% 的女生。男生总是穿长裤,女生则一半穿长裤一半穿裙子。有了这些信息之后我们可以容易地计算“随机选取一个学生,他(她)穿长裤的概率和穿裙子的概率是多大”,这个就是前面说的“先验概率”的计算。
后验概率: 假设你走在校园中,迎面走来一个穿长裤的学生(很不幸的是你高度近似,你只看得见他(她)穿的是否长裤,而无法确定他(她)的性别),你能够推断出他(她)是女生的概率是多大吗?这就是所谓的“后验概率”。
将上例转化为分类问题,则类别c={男,女},学生个体为样本x,其中xX,其中随机变量X是一维向量,只有唯一的属性:∈{长裤,裙子}
先验概率的计算:

P(pants)=60100+4050=80

表示随机选取一个学生,他(她)穿长裤的概率的概率。
后验概率的计算:

P(girlpants)=P(穿/穿)=P(girl,pants)P(pants)=P(girl)P(pantsgirl)P(pants)=4050÷80=25

表示一个穿长裤的学生是女生的概率。
在求解后验概率的公式中,我们用到了以下两个公式:

P(cx)=P(x,c)P(x)P(c|x)=P(x,c)P(x)()

贝叶斯定理:贝叶斯定理提供了一种从P(c),P(x)P(x|c)计算后验概率的方法。

公式 含义
x 属性
c 类别
P(c|x) 后验概率(给定预测变量的类的后验概率)
P(x|c) 似然概率(预测器给定类的概率的可能性)
P(c) 先验概率(类的先验概率)
P(x) 边际似然概率(预测器的先验概率)

二、贝叶斯公式

让我们从一个摸球的例子来理解条件概率。我们有两个桶:灰色桶和绿色桶,一共有7个小球,4个蓝色3个紫色,分布如下图:

从这7个球中,随机选择1个球是紫色的概率p是多少?
选择过程如下:先选择桶,再从选择的桶中选择一个球。

p(=)=p()p()+p(绿)p()=1224+1212

上述我们选择小球的过程就是信息不断明确的过程,条件概率形成的过程,在选择桶的颜色的情况下是紫色的概率,另一种计算条件概率的方法是贝叶斯准则。
贝叶斯公式是英国数学家提出的一个数据公式:

p(A|B)=p(A,B)p(B)=p(B|A)p(A)aAp(B|a)p(a)

p(A,B):表示事件A和事件B同时发生的概率。
p(B):表示事件B发生的概率,叫做先验概率;p(A):表示事件A发生的概率。
p(A|B):表示当事件B发生的条件下,事件A发生的概率叫做后验概率。
p(B|A):表示当事件A发生的条件下,事件B发生的概率。

偷窃与狗吠:​住在一座别墅里的一家人,在过去的 1 年中,发生了 2 次盗窃,这家人养了一只狗,这只狗平均每周晚上叫 3 次,而且,当发生盗窃时,这只狗会叫的概率是 0.9,那么在这只狗叫的情况下,发生盗窃的概率是多少?
​我们假设 A 事件是狗晚上叫,则 P(A) = 3/7 ,假设 B 事件是发生盗窃,则P(B) = 2/365 。我们还知道,当 B 事件发生的条件下,A 事件发生的概率 P(A|B) = 0.9 。因此,根据贝叶斯公式,我们推断得到,狗叫时,发生盗窃的概率,即:

p(B|A)=p(A,B)p(A)=p(A|B)p(B)p(A)

我们用一句话理解贝叶斯:世间很多事都存在某种联系,假设事件A和事件B。人们常常使用已经发生的某个事件去推断我们想要知道的之间的概率。例如,医生在确诊的时候,会根据病人的舌苔、心跳等来判断病人得了什么病。对病人来说,只会关注得了什么病,医生会通道已经发生的事件来确诊具体的情况。这里就用到了贝叶斯思想,A是已经发生的病人症状,在A发生的条件下是B发生的概率。

三、后验概率的R计算

例1:假设有三种类型的硬币,分别是硬币ABC。 硬币ABC投出正面的概率分别为 0.5,0.6 和0.9。 我们有个抽屉,里面放了5枚硬币,其中A类2枚,B类2枚,C类1枚。 小明从5个硬币中随机拿一枚,投一次,发现这次投出了正面。 请问这枚硬币最有可能是ABC类的哪一种?

【解析】小明先随机拿骰子,概率分别为0.4,0.4,0.2, 然后这三个骰子掷出正面的概率分别为0.5,0.6,0.9, 已知结果为下图画圈的H,设为事件D,那么小明拿到硬币A、B或C的概率就是求后验概率。
先验概率为:
P(A)=0.4P(B)=0.4P(C)=0.2
在ABC 三个筛子下 投出正面的概率为:
P(D|A)=0.5P(D|B)=0.6P(D|C)=0.9
我们要求的是已知D为正面的情况下,这枚硬币是A、B或C的概率是多少? 也就是说要比较以下三个数字的大小:
P(A|D)P(B|D)P(C|D)
利用贝叶斯公式, 我们还有一个概率P(D)并不知道,但我们可以算,因为“D = 正面”发生的概率是所有条件下发生“D=正面”概率的和。用公式表示就是这样:

P(D)=P(D|A)×P(A)+P(D|B)×P(B)+P(D|C)×P(C)P(D)=P(D|A)×P(A)+P(D|B)×P(B)+P(D|C)×P(C)

好了,我们没有未知的了,代入就能比较大小。

P(D)=P(D|A)×P(A)+P(D|B)×P(B)+P(D|C)×P(C)=0.40.5+0.40.6+0.2×0.9=0.62

P(A|D)=P(D|A)×P(A)P(D)=0.50.40.62=0.20.62

P(B|D)=P(D|B)×P(B)P(D)=0.60.40.62=0.240.62

P(C|D)=P(D|C)×P(C)P(D)=0.20.90.62=0.180.62

左:先验概率;右:后验概率

从上图我们可以看到,已知第一次掷骰子的结果为正面,那么小明最有可能拿到的是B类骰子。这样我们就完成了一次贝叶斯更新。
如果小明再用这个骰子掷一次硬币,这次的结果也是正面,那么小明手里的硬币为ABC的概率分别是多少? 我们可以把第一次的后验概率P(A|D) 作为这次的先验概率,然后再进行一次贝叶斯更新,计算出后检验概率,代入贝叶斯公式。

P(A|D1=1,D2=1)=P(D1=1,D2=1|A)×P(A)P(D)=P(D1=1|A)×P(D2=1|A)×P(A)P(D1=1,D2=1)

同理可计算出P(B|D1=1,D2=1)P(C|D1=1,D2=1)的概率,代入数字可以得到:

P(A|D1=1,D2=1)=P(D1=1|A)×P(D2=1|A)×P(A)P(D1=1,D2=1)=0.40.50.50.40.50.5+0.40.60.6+0.20.90.9=0.2463

P(B|D1=1,D2=1)=P(D1=1|B)×P(D2=1|B)×P(B)P(D1=1,D2=1)=0.40.60.60.40.50.5+0.40.60.6+0.20.90.9=0.3547

P(C|D1=1,D2=1)=P(D1=1|C)×P(D2=1|B)×P(C)P(D1=1,D2=1)=0.20.90.90.40.50.5+0.40.60.6+0.20.90.9=0.3990

有的人已经发现了。倒数第二步的分母是常数,这个常数只是为了保证所有的后验概率的和为1, 那么其实我们根本就不需要计算P(D), 只需计算分子,在扩大或缩小几倍,让他们的和为1 就行了。这两个贝叶斯更新可以用下图表示出来

以上就是先验概率为离散数据时更新后验概率的方法。

例2:这里使用西瓜数据集3.0部分数据如下:

色泽 青绿 乌黑 乌黑 青绿 浅白 青绿
好瓜
色泽 青绿 乌黑 乌黑 乌黑 青绿 乌黑
好瓜
色泽 浅白 浅白 青绿 浅白 乌黑 浅白
好瓜

收集的样本容量为18。这里色泽x是西瓜的特征变量,其可取值(青绿,乌黑,浅白);好瓜y可取值(是,否)两个分类,当然可转化为分类值(-1,1)来表示。目前有一个新瓜,其色泽为“乌黑”,试用贝叶斯公式确定y的取值,即求后验概率。

【解析】
先验概率P(y)为:

P(好瓜=是)=8180.444

P(好瓜=否)=10180.556

options(digits=4)
library(openxlsx)
data=read.xlsx("melon5.xlsx")
#先验概率
prior.yes = sum(data[,2] == "是") / length(data[,2])
prior.no  = sum(data[,2] == "否") / length(data[,2])

似然概率(条件概率)P(x|y)为:

P青绿|是=P(色泽=青绿|好瓜=是)=38=0.375

P青绿|否=P(色泽=青绿|好瓜=否)=310=0.300

P浅白|是=P(色泽=浅白|好瓜=是)=18=0.125

P浅白|否=P(色泽=浅白|好瓜=否)=410=0.400

P乌黑|是=P(色泽=乌黑|好瓜=是)=48=0.500

P乌黑|否=P(色泽=乌黑|好瓜=否)=310=0.300

#似然概率
likeli=table(data[,2],data[,1])   #注意变量先后
likeli[1,]=likeli[1,]/sum(data[,2] == "否")
likeli[2,]=likeli[2,]/sum(data[,2] == "是")
likeli
   浅白  青绿  乌黑
否 0.400 0.300 0.3000.125 0.375 0.500

后验概率P(y|x)为:

P乌黑=P(色泽=乌黑)=P(色泽=乌黑|好瓜=是)P(好瓜=是)+P(色泽=乌黑|好瓜=否)P(好瓜=否)=718

P是|乌黑=P(好瓜=是|色泽=乌黑)=P(色泽=乌黑|好瓜=是)P(好瓜=是)P色泽=乌黑=47

P否|乌黑=P(好瓜=否|色泽=乌黑)=P(色泽=乌黑|好瓜=否)P(好瓜=否)P色泽=乌黑=37

posti=likeli
prior=cbind(prior.no,prior.yes)
xpr=prior %*% likeli

for (i in  1:(dim(likeli)[2])) {
posti[1,i]=likeli[1,i]* prior[1]  /xpr[i]
posti[2,i]=likeli[2,i] * prior[2] /xpr[i]
}
#后验概率
posti   #第三列就是上面示例的后验概率
   浅白   青绿   乌黑
否 0.8000 0.5000 0.42860.2000 0.5000 0.5714

总结

贝叶斯后验概率是一种学习机制。先验概率不是根据有关自然状态的全部资料测定的,而只是利用现有的材料(主要是历史资料)计算的;后验概率是指在得到“结果”的信息后重新修正的概率,是“执果寻因”问题中的"果"。后验概率使用了有关自然状态更加全面的资料,既有先验概率资料,也有补充资料;先验概率的计算比较简单,没有使用贝叶斯公式;而后验概率的计算,要使用贝叶斯公式,而且在利用样本资料计算逻辑概率时,还要使用理论概率分布,需要更多的数理统计知识。

参考文献

  1. 风险型决策分析及其python实现
  2. 贝叶斯
  3. 贝叶斯——朴素贝叶斯算法以及案例代码(Python版)
  4. 用贝叶斯 计算后验概率(一)
posted @   郝hai  阅读(975)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示