点击阅读原文可获得工具包连接与密码:sm2s
贝叶斯ThomasBayes,英国数学家。他首先将归纳推理法用于概率论基础理论,并创立了贝叶斯统计理论,对于统计决策函数、统计推断、统计的估算等做出了贡献。
贝叶斯决策理论是主观贝叶斯派归纳理论的重要组成部分。贝叶斯决策就是在不完全情报下,对部分未知的状态用主观概率估计,然后用贝叶斯公式对发生概率进行修正,最后再利用期望值和修正概率做出最优决策。其基本思想是:
贝叶斯公式:
P(B[j]|A[i])=P(A[i]|B[j])P(B[j])/P(A[i])
未知事件中A[i]出现时B[j]出现的后验概率在主观上等于已有事件中B[j]出现时A[i]出现的先验概率值乘以B[j]出现的先验概率值然后除以A[i]出现的先验概率值最终得到的结果。这就是贝叶斯的核心思想:用先验概率估计后验概率。
具体到分类模型中,上述公式可以理解为:将B[j]看作分类的一种,将A[i]看作样本的特征属性之一,此时等号左边为待分类样本中出现特征A[i]时该样本属于类别B[j]的概率P(B[j]|A[i]),而等号右边是根据训练样本统计得到的特征A[i]出现子类别B[j]中的概率P(A[i]|B[j])乘以类别B[j]在训练样本中出现的概率P(B[j])最后除以特征A[i]在训练样本中出现的概率P(A[i])。
以下为基本的概念介绍,有概率论知识基础的可以跳过,这部分主要是为一些不理解上面公式的初始学习者进行指导。
定义1.一个随机试验E所有可能的结果构成的集合称为该随机试验E样本空间,记为S。样本空间的元素,即E的每个结果,称为样本点。试验E的样本空间S的子集为E的随机事件,简称为事件。
定义2.设E是随机事件,S是它的样本空间。对于E的每一事件A赋予一个实数,记为P(A),称为事件发生的概率。
定义3.设A,B是两个事件,且P(A)>0,则称P(B|A)=P(AB)/P(A)为在事件A发生的条件下事件B发生的条件概率,其中P(AB)表示事件A与事件B同时出现的概率,公式P(B|A)=P(AB)/P(A)称为条件概率公式。
根据条件概率公式可知:P(AB)=P(B|A)P(A),若B[1],B[2],……,B[m]为样品空间S的一个划分,且P(B[i])>0,i=1,2,……,m,则有P(A[i])=P(A[i]|B[1])P(B[1])+P(A[i]|B[2])P(B[2])+……+P(A[i]|B[m])P(B[m]);故有贝叶斯的另一种形式:
P(B[j]|A[i])=P(A[i]|B[j])P(B[j])/∑P(A[i]|B[j])P(B[j])
朴素贝叶斯是基于一个简单假设所建立的一种贝叶斯方法,朴素贝叶斯假定样本的不同特征属性对样本的归类影响时相互独立的。此时若样本A中同时出现特征A[i]与A[k],则样本A属于类别B[j]的概率为:
P(B[j]|A)=P(B[j]|A[i],A[k])=P(B[j]|A[i])P(B[j]|A[k])
朴素贝叶斯模型:
样本a=(a[1],a[2],……,a[n]);为n维布尔向量,用来表示样本a中特征A[i]是否出现。
类别B∈{B[1],B[2],……,B[m]}为m类的分类问题,B[j]表示m个类别中的一个。
训练样本x[1],x[2],……,x[t],其中x[k]=(x[k][1],x[k][2],……,x[k][n])为n维布尔向量,训练样本的类别为b[1],b[2],……,b[t];
现考虑待分类样本y=(y[1],y[2],……,y[n]);属于每个类别的概率情况。
1、考虑训练样本中类别B[j]的概率值P(B[j])
P(B[j])=类别为B[j]的训练样本数/总训练样本数t
2、考虑训练样本中特征A[i]在类别B[j]中的出现的相对概率值P(A[i]|B[j])
P(A[i]|B[j])=类别为B[j]并包含特征A[i]的训练样本数/类别为B[j]的训练样本数
3、根据1、2计算训练样本中特征A[i]的概率值P(A[i])
P(A[i])=∑P(A[i]|B[j])P(B[j])
4、根据贝叶斯公式计算待分类样本中出现特征A[i]时样本属于B[j]的相对概率P(B[j]|A[i])
5、根据朴素贝叶斯的假设得出样本y属于类别B[j]的概率P[j]
P[j]=∏P(B[j]|A[i])*y[i]
6、同法求出样本y属于其他各个类别的概率从而得到:P[1],P[2],……,P[m]。然后在对这m个概率值进行归一化,并排序,从而得到待分类样本y属于各个类别的相似度以及最终的归类
Matlab贝叶斯网络建模
3、关于FULLBNT使用简单教程
1.学习树扩展贝叶斯网络结构的TANC算法.
2.数据完整条件下学习一般贝叶斯网络结构学习算法
数据完整条件下贝叶斯结构算法
算法名称
调用函数
K2算法
learn_struct_k2()
贪婪搜索GS(greedysearch)算法
earn_struct_gs()
爬山HC(hillclimbing)算法
learn_struct_hc()
……
3.缺失数据条件下学习一般贝叶斯网络结构学习算法
缺失数据条件下贝叶斯结构算法
最大期望EM(expectationmaximization)算法
learn_struct_EM()
MCMC(MarkovChainMonteCarlo)
learn_struct_mcmc()
1.BNT中也提供了丰富的参数学习函数,都有:
2.完整数据时,学习参数的方法主要有两种:最大似然估计learn_params()和贝叶斯方法bayes_update_params();
3.数据缺失时,如果已知网络拓扑结构,用EM算法来计算参数,learn_params_em()。
BNT中提供了多种推理引擎,都有:
BNT推理引擎
联合树推理引擎
jtree_inf_engine()
全局联合树推理引擎
global_joint_inf_engine()
信念传播推理引擎
belprop_inf_engine()
变量消元推理引擎
var_elim_inf_engine()
采样传播引擎
gibbs_sampling_inf_engine
Fullobs
Partialobs
Point
learn_params
learn_params_em
Bayes
Bayes_update_params
notyetsupported
Noisy-or节点
一个Noisy-or节点就像通常的“或”门一样,但有时父节点的效果将被抑制。受抑制的父节点i的概率用来表示。一个节点C,有两个父节点A和B,有如下CPD,使用F和T来表达关和开,(在BNT中是1和2)。
A
B
P(C=off)
P(C=on)
F
1.0
0.0
T
qA)
1-q(A)
q(B)
1-q(B)
q(A)q(B)
1-q(A)q(B)
Softmax节点
神经网络节点使用一个多层感知器实现了从连续父节点向离散子节点的映射。
高斯节点将连续值的节点处理成一个离散的情况
广义线性模型节点
分类/回归树节点
bnet3=learn_params(bnet2,samples);
B=1
B=2
B=3
A=1
1
A=2
1/6
我们将N/(q*r)放入每个格;N是等效的样本大小,r=|A|,q=|B|.这可以按如上面方式创建:
这里1是等效样本大小,也是先验概率的强度。你可以使用上面面方式更改它,
算法概要
贝叶斯模型选择算法
1.建立模型A->B,生成样本数据
2.建立所有可能的结构:(1)AB,(2)B<-A,(3)A->B并计算先验概率
3.模型2和模型3为Markovequivalent
4.B节点使用noisyNotgate
5.正确的模型在12次后收敛
代码示例
BNT中的结构学习程序可以按类似参数学习的情况分成四类:
learn_struct_K2
learn_struct_mcmc
如果两个DAGs编码同样的条件独立,它们被叫做Markov等效。所有DAGs的集合可以被分割成Markov等效类。同一类内的线图可以有方向,它们弧的颠倒不会改变任何CI关系。每一类都可以用一个PDAG(partiallydirectedacyclicgraph,局部有向非循环图)这种图被称为本质图或方向图。这个详细说明哪个边必须在某一个方位上被定向,哪个可能被颠倒。
穷举搜索
结构学习的强有力手段是列举DAGs的所有可能性,并对它们一一打分。这为其它算法的比较提供了一个“黄金标准”。我们按如下做:
dags=mk_all_dags(N);
score=score_dags(data,ns,dags);
默认的情况下,我们使用贝叶斯打分规则,并假定CPDs是用带有BDeu的先验表表示的。如果想是用一致的先验值,我们可以通过如下方法覆盖这些默认值。
params=cell(1,N);
fori=1:N
end
实际上不能列举N>5的所有可能的DAGs。
order=[CSRW];
max_fan_in=2;
爬山法
爬山算法从状态空间中的一个指定点开始,考虑所有最接近的邻节点,然后移向得分最高的相邻节点。当相邻节点得分没有高于当前节点时(例如到达了局部最大值。),算法停止。然后从空间的其它部分重新开始。“相邻”通常定义为所有的图可以通过从当前的图添加、删除或翻转一个单独的弧得出,并服从无环的约束。其它相邻的可能详。
MCMC
使用Metropolis-Hastings(MH)的马尔可夫链蒙特卡尔算法来搜索所有的图空间。标准的分配提案是考虑移动所有最近的按上面定义的邻节点。这个函数可以按如下方法调用:
SEM算法
计算贝叶斯打分时,有部分是计算具有挑战性的观测,因为参数学习的后验概率变成了多峰的状态(这是由于隐含节点导致了一个混合的分布)。因此需要使用逼近算法,如BIC。不幸的是搜索算法仍然是代价高昂的,因为我们需要在每一步运行EM算法来计算MLE
值,它需要对每一个模型进行计算打分。一个变换的方法是在每步进行局域搜索来替代第M步的EM,当数据是“添满”状态时这种方法非常有效。——以上被称为结构上的EM算法(Friedman1997)它可以通过BIC打分收敛的局部最大值来证明。
创立好一个贝叶斯网络,我们现在可以用它来进行推断。贝叶斯网络中有许多不同的算法来作为推断的的工具,在速度、复杂性、普遍性和精确性上有不同的表现。BNT因此提供了多种多样的不同的推断引擎。
推理引擎是一个包含了bnet(Bayesiannet)支持enter_evidence和marginal_nodes方法的对象。引擎设计者把bnet作为一个自变量,并且可以执行一些特殊处理的模型。当调用enter_evidence,引擎可以处理一些经过特殊处理的证据。最后,当调用,marginal_nodes引擎可以执行一些特殊处理的查询。
engine=jtree_inf_engine(bnet);
最简单的推理方法是直接构建所有结点的联合分布,然后得到边缘概率。这已在global_joint_inf_engine中实现,但它仅适用于教学和调试。
likelihood_weighting_inf_engine,可以完成重要采样,并能够处理任意种类的结点。gibbs_sampling_inf_engine,由BhaskaraMarthi写的.目前它仅能处理表格条件概率分布(tabularCPDs)。
Python贝叶斯文档分类模型
朴素贝叶斯的一般过程
(1)收集数据:可以使用任何方法。本文使用RSS源
(2)准备数据:需要数值型或者布尔型数据
(3)分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好
(4)训练算法:计算不同的独立特征的条件概率
(5)测试算法:计算错误率
(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。
准备数据:从文本中构建词向量
以上是六句话,标记是0句子的表示正常句,标记是1句子的表示为粗口。我们通过分析每个句子中的每个词,在粗口句或是正常句出现的概率,可以找出那些词是粗口。
在bayes.py文件中添加如下代码:
[python]viewplaincopy
训练算法:从词向量计算概率
1.#朴素贝叶斯分类器训练函数2.#trainMatrix:文档矩阵,trainCategory:由每篇文档类别标签所构成的向量3.deftrainNB0(trainMatrix,trainCategory):4.numTrainDocs=len(trainMatrix)5.numWords=len(trainMatrix[0])6.pAbusive=sum(trainCategory)/float(numTrainDocs)7.p0Num=zeros(numWords);8.p1Num=zeros(numWords);9.p0Denom=0.0;10.p1Denom=0.0;11.foriinrange(numTrainDocs):12.iftrainCategory[i]==1:13.p1Num+=trainMatrix[i]14.p1Denom+=sum(trainMatrix[i])15.else:16.p0Num+=trainMatrix[i]17.p0Denom+=sum(trainMatrix[i])18.p1Vect=p1Num/p1Denom19.p0Vect=p0Num/p1Denom20.returnp0Vect,p1Vect,pAbusive运行结果:
测试算法:根据现实情况修改分类器
上一节中的trainNB0函数中修改几处:
p0Num=ones(numWords);p1Num=ones(numWords);p0Denom=2.0;p1Denom=2.0;p1Vect=log(p1Num/p1Denom)p0Vect=log(p0Num/p1Denom)[python]viewplaincopy
准备数据:文档词袋模型
词集模型(set-of-wordsmodel):每个词是否出现,每个词只能出现一次
词袋模型(bag-of-wordsmodel):一个词可以出现不止一次
1.#朴素贝叶斯词袋模型2.defbagOfWords2VecMN(vocabList,inputSet):3.returnVec=[0]*len(vocabList)4.forwordininputSet:5.ifwordinvocabList:6.returnVec[vocabList.index(word)]+=17.returnreturnVec示例:使用朴素贝叶斯过滤垃圾邮件
(1)收集数据:提供文本文件
(2)准备数据:将文本文件解析成词条向量
(3)分析数据:检查词条确保解析的正确性
(4)训练算法:使用我们之前建立的trainNB0()函数
(5)测试算法:使用classifyNB(),并且构建一个新的测试函数来计算文档集的错误率
(6)使用算法:构建一个完整的程序对一组文档进行分类,将错分的文档输出到屏幕上
使用正则表达式切分句子
测试算法:使用朴素贝叶斯进行交叉验证
因为这些电子邮件是随机选择的,所以每次输出的结果可能会不一样。
今天的推文就到这吧,我感冒发烧了,有点难受。各位晚安。