基于R语言 | 贝叶斯规则简单实例

实例

假设我们有一个制作灯泡的机器,想知道机器是正常工作还是有问题。为了得到答案我们可以测试每一个灯泡,但是灯泡的数量可能会很多。
但使用少量样本和贝叶斯规则,我们可以估计机器是否在正常的工作。

即我们需要计算给定先验分布、似然率和观察数据序列后的后验概率。

变量定义

我们定义以下变量:
工作状态(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))

得到的结果如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章