实例
假设我们有一个制作灯泡的机器,想知道机器是正常工作还是有问题。为了得到答案我们可以测试每一个灯泡,但是灯泡的数量可能会很多。
但使用少量样本和贝叶斯规则,我们可以估计机器是否在正常的工作。
即我们需要计算给定先验分布、似然率和观察数据序列后的后验概率。
变量定义
我们定义以下变量:
工作状态(prior):{working,broken}
机器状态(likelihood):{good,bad}
观察到的灯泡序列(data)
#先验概率
prior<-c(working=0.99, broken=0.01)
#似然率
likelihood<-rbind(working=c(good=0.99,bad=0.11),
broken=c(good=0.6,bad=0.4))
#数据序列
data<-c("bad","bad","bad","bad")
其中likelihood是矩阵的形式,如下:
函数定义
再定义如下的贝叶斯更新函数:
bayes <- function(prior, likelihood, data)
{
#创建一个矩阵,存储后验分布的连续计算结果
posterior <- matrix(0, nrow=length(data), ncol=length(prior))
dimnames(posterior) <- list(data, names(prior))
#对于每一个数据,给定当前先验概率计算后验概率
initial_prior = prior
for(i in 1:length(data))
{
#贝叶斯公式
posterior[i, ] <-
prior*likelihood[ , data[i]]/
sum(prior * likelihood[ , data[i]])
#新的先验概率是当前的后验概率
#同样的过程可迭代
prior <- posterior[i , ]
}
#返回一个矩阵,包含初始先验概率和所有的后续后验概率
return(rbind(initial_prior,posterior))
}
返回的矩阵如下:
可视化结果
随着坏灯泡的增多,机器正常的概率快速下降,我们可以使用matplot绘出两个分布的演化情况:
#增加坏灯泡的数量
data<-c("bad","bad","bad","bad","bad","bad","bad","bad","bad","bad","bad","bad")
#绘图
matplot(bayes(prior,likelihood,data),
t='b', lty=1, pch=20,col=c(3,2))
得到结果如下:
探索分析
修改先验概率
假设我们不知道机器是否可以正常工作,我们为每一种情况指认相同的概率:50%
prior<-c(working=0.5, broken=0.5)
matplot(bayes(prior,likelihood,data),t='b', lty=1, pch=20,col=c(3,2))
得到的结果如下:
则得到了一个快速收敛的曲线,机器有问题的概率很高。
修改数据序列
假设机器正常工作的概率是99%。我们观察10个灯泡,其中第一个灯泡是坏的,之后的灯泡都是好的。
prior<-c(working=0.99, broken=0.01)
data<-c("bad","good","good","good","good","good","good","good","good","good")
matplot(bayes(prior,likelihood,data),t='b', lty=1, pch=20,col=c(3,2))
得到的结果如下: