基於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))

得到的結果如下:
在這裏插入圖片描述

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