實例
假設我們有一個製作燈泡的機器,想知道機器是正常工作還是有問題。爲了得到答案我們可以測試每一個燈泡,但是燈泡的數量可能會很多。
但使用少量樣本和貝葉斯規則,我們可以估計機器是否在正常的工作。
即我們需要計算給定先驗分佈、似然率和觀察數據序列後的後驗概率。
變量定義
我們定義以下變量:
工作狀態(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))
得到的結果如下: