机器学习

贝叶斯规则的第一个例子

2018-03-12  本文已影响2人  灵妍

申明:概率图模型-基于R语言读书笔记
1、案例
一台生产硬币的机器,机器和硬币都有两种状态,机器的先验概率使我们关于机器工作状态的初始信念,似然率是在已知机器状态下,硬币的状态,例子中,我们需要根据新进来的数据,也就是硬币的好坏来更新初始信念。
直观上讲,这类题目就好比我们信任一个人,但是这个人有一次骗了我们,我们对它就没有以前那么信任了,之后在一次重要事件中,他说明了骗我的原因,对我坦诚了,我又恢复了对他的一部分信任。
在数学上讲,使用贝叶斯模型是要在新的事实可用时计算后验分布,使用后验概率作为新的概率,并在序列中更新后验分布。简单地说,就是我们通过计算已知一个硬币是坏的情况下,机器的概率分布,更新机器先验分布。这个可以通过贝爷斯公式求得,灯泡是坏的概率由机器的好坏状态加和求得,也就是机器是好的情况下灯泡是坏的概率加上机器是坏的情况下灯泡是坏的概率,消去机器这个变量。如果有多个例子,可以利用循环语句更新先验分布,依次计算。
2、自然语言描述:
创建变量和分布-根据第一个例子计算后验分布-更新先验分布-加入第二个例子计算后验分布-更新先验分布-依次循环直到例子用完。
3、函数代码

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))
}

4、运行结果代码

> prior<-c(working=0.99,broken=0.01)
> likelihood<-rbind(working=c(good=0.99,bad=0.01),broken=c(good=0.6,bad=0.4))
> data<-c("bad","bad","bad","bad")
> bayes(prior,likelihood,data)
                   working    broken
initial_prior 9.900000e-01 0.0100000
bad           7.122302e-01 0.2877698
bad           5.826957e-02 0.9417304
bad           1.544486e-03 0.9984555
bad           3.867038e-05 0.9999613

5、结果可视化1
matplot(bayes(prior,likelihood,data),t='b',lty=c(1,2),pch=20,col=c(3,2))


结果可视化1.png

6、结果可视化2
prior<-c(working=0.5,broken=0.5)
matplot(bayes(prior,likelihood,data),t='b',lty=c(1,2),pch=20,col=c(3,2))


结果可视化2.png

7、结果可视化3
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=c(1,2),pch=20,col=c(3,2))


结果可视化3.png

8、联合树推理模型代码

library("gRain")

machine_val<-c("working","broken")
light_bulb_val<-c("good","bad")
machine_prob<-c(99,1)
light_bulb_prob<-c(99,1,60,40)
M<-cptable(~machine,values=machine_prob,levels=machine_val)
L<-cptable(~light_bulb |machine,values=light_bulb_prob,levels=light_bulb_val)

plist<-compileCPT(list(M,L))
plist

plist$machine
plist$light_bulb

net<-grain(plist)
net2<-setEvidence(net,evidence=list(light_bulb="bad"))
querygrain(net2,nodes=c("machine"))

运行结果:


加入证据之后新的推理结果.png 运行结果2.png plist.png

这里通过推理算法,可以直接求出加入证据之后的新的先验概率,不用自己手工编写算法了。
在贝叶斯网络的知识体系中,我们称之为影响链,即一个节点概率分布的变化会引起链条上其它节点概率分布的变化。传统的思维是已知灯泡是坏的,通过贝叶斯规则的学习后,我们知道已知的不是灯泡是坏的,是后续生产的灯泡好坏的序列来更新贝叶斯网络的节点概率分布。样本数据是以100为标准的,我不知道这样的频率表示,与之前的信度概率表示有什么区别,就是1000中有10个和100中有1个,显然如果按照之前的计算方法,是没有区别的。但是对于联合树推理算法,就不一定了。

上一篇下一篇

猜你喜欢

热点阅读