博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
朴素贝叶斯分类及应用
阅读量:6073 次
发布时间:2019-06-20

本文共 3162 字,大约阅读时间需要 10 分钟。

贝叶斯学习

贝叶斯公式

贝叶斯学习器事实上是从经典的贝叶斯概率公式的来的,对于经典的贝叶斯公式:

P(A|B)=P(B|A)P(A)P(B)
式中P(A)表示A的先验概率(即A发生的概率与B无关),P(A|B)表示A的后验概率(即在已知B发生的情况下,A发生的概率)

朴素贝叶斯分类

我们都知道贝叶斯是一个经典的求取概率的公式。那么贝叶斯又是怎么和分类相联系起来的呢?

实际上。在分类的过程中,我们要推断某样本x是否属于某类别A时。能够将这件事看成是个概率问题,即推断x属于A的可能性有多大。如果类别有n种,则仅仅需求取x分别属于每一个样本的概率有多大,概率值最大的。就可以觉得是x的所属类别。

朴素贝叶斯分类的正式定义例如以下:

1. 设x={
a1,a2,...,am}
为一个带分类项,当中每一个a的为x的一个特征属性.
2. 有类别集合

$C={
y1,y2,...yn}
$。

  1. 计算P(y1|x)P(y2|x),…,P(yn|x)

  2. 如果P(yk|x)=max{

    (y1|x),P(y2|x),...,P(yn|x)}
    xyk

如今从定义能够看出每步并不难理解。关键时第三步中的每一个概率值怎么求取。对于单个变量,求取其概率值比較好求,可是这里的x时一个含有m个属性的变量。这样的情况下。该怎么求取其属于某类别yn的概率是多少呢?

以下给出求解推导:

已知我们要求取P(yi|x)的概率值,依据贝叶斯公式能够将其转换为例如以下形式:

P(yi|x)=P(x|yi)P(yi)P(x)
所以求取
P(yi|x)就变成了求
P(x|yi)P(yi)P(x)

对于P(x|yi)。由于x含有m个属性变量。因此能够将其写成P({
a1,a2,...,am}|yi)

对于大多数情况。x的各个属性之间都是相互独立,所以有:

P(x|yi)P(yi)=P(a1|yi)P(a2|yi)...P(am|yi)P(yi)=P(yi)j=1mP(aj|yi)
因此:
P(yi|x)=P(yi)mj=1P(aj|yi)P(x)
至此。便得到了
P(yi|x)的概率值求解表达式,只是这里的P(X)的值不知道为多少。可是,依据贝叶斯分类的思想,我们仅仅要找到概率最大的一项即就可以,对于不同的类别
yi
P(yi|x)终于的求解表达式中都含有P(X),因此仅仅要求解。使
P(yi)mj=1P(aj|yi)最大就可以。

朴素贝叶斯分类应用实例(目标跟踪)

对于目标跟踪,眼下用的比較多的方法都是在待跟踪目标区域周围获取候选窗体。然后推断这些候选窗体是否是目标。

在推断的过程中,往往採都是计算候选窗体属于时目标的概率值,值越大,则其时目标的可能性就越大。

这样的思想和朴素贝叶斯分类的思想很类似。

以下以压缩感知跟踪为例。

在感知压缩跟踪。作者将贝叶斯当成了一个在线学习的分类器,此分类器在分为分类和更新參数两个部分。

在分类阶段(第t帧)

首先在目标框(t-1帧确定的位置)周围一定范围内选取m个候选框。

对候选框提取特征。得到特征向量v⃗ =(v1,v2,...,vn)每一个向量都含有n个属性值。现要求v⃗ 是后选框的概率值。依据朴素贝叶斯可知:

P(y=1|v⃗ )=P(y=1)ni=1P(vj|y=1)P(v⃗ )
可是要是单纯的求取这个式子并不好求。由于我们并不知道式子中
P(v⃗ )的概率值。
只是,注意到既然不能求解
P(v⃗ ),那能否够将这一项消去?

因此将求取P(y=1|v⃗ )转化为求取P(y=1|v⃗ )P(y=0|v⃗ )

P(y=1|v⃗ )P(y=0|v⃗ )=P(y=1)ni=1P(vj|y=1)P(y=0)ni=1P(vj|y=0)
对上式左右两边同取log(为了方便计算。将累乘变为累加)
H(v)=i=1nlogP(y=1)P(vi|y=1)P(y=0)P(vi|y=0)
这里假定先验概率
P(y=1)=P(y=0),y代表样本标签。

则可得:

H(v)=i=1nlogP(vi|y=1)P(vi|y=0)
当中:
P(vi|y=1)N(μ1i,σ1i)
P(vi|y=0)N(μ0i,σ0i)

在參数更新阶段(第t帧)

在分类阶段时,已经确定了第t帧中目标所在的位置,接下来来便更新学习机的參数。

,会在目标框周围一定范围α内获取m个候选框(α代表到目标框中心位置的距离),将其定为正样本。然后在范围(α,β)内获取n个负样本框(mn)。

得到正负样本后,便開始跟新分类器的參数,更新方式例如以下:

μ1iλμ1i+(1λ)μ1
σ1iλ(σ1i)2+(1λ)(σ1)2+λ(1λ)(μ1iμ1)2
式子中的
λ时学习參数。

实践代码

这是分类代码

void CompressiveTracker::radioClassifier(vector
& _muPos, vector
& _sigmaPos, vector
& _muNeg, vector
& _sigmaNeg, Mat& _sampleFeatureValue, float& _radioMax, int& _radioMaxIndex){ float sumRadio; _radioMax = -FLT_MAX; _radioMaxIndex = 0; float pPos; float pNeg; int sampleBoxNum = _sampleFeatureValue.cols; for (int j=0; j
(i,j)-_muPos[i])*(_sampleFeatureValue.at
(i,j)-_muPos[i]) / -(2.0f*_sigmaPos[i]*_sigmaPos[i]+1e-30) ) / (_sigmaPos[i]+1e-30); pNeg = exp( (_sampleFeatureValue.at
(i,j)-_muNeg[i])*(_sampleFeatureValue.at
(i,j)-_muNeg[i]) / -(2.0f*_sigmaNeg[i]*_sigmaNeg[i]+1e-30) ) / (_sigmaNeg[i]+1e-30); sumRadio += log(pPos+1e-30) - log(pNeg+1e-30); // equation 4 } if (_radioMax < sumRadio) { _radioMax = sumRadio; _radioMaxIndex = j; } }}

这是參数跟新代码

void CompressiveTracker::classifierUpdate(Mat& _sampleFeatureValue, vector
& _mu, vector
& _sigma, float _learnRate){ Scalar muTemp; Scalar sigmaTemp; for (int i=0; i

转载地址:http://qpngx.baihongyu.com/

你可能感兴趣的文章
26.CSS前缀和rem
查看>>
java transient关键字
查看>>
mvc model 传值两种方式区别
查看>>
spring
查看>>
正方教务处抓包分析
查看>>
第一次作业
查看>>
openjudge2985(数字组合)
查看>>
步步为营 .NET 设计模式学习笔记 二十二、Memento(备望录模式)
查看>>
步步为营UML建模系列四、状态图(State)
查看>>
(7)javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框...
查看>>
asp.net上传图片
查看>>
如何修改EF的代码生成策略
查看>>
Yii2.0实现语言包切换功能
查看>>
寒假的Java学习笔记总结1
查看>>
C#判断操作系统的位数
查看>>
利用a标签自动解析URL
查看>>
堆,栈,字符串池,以及进程,线程浅谈内存(个人理解)
查看>>
sql语句(Mysql数据库)
查看>>
面向对象小练习
查看>>
Javaweb学习笔记——(二)——————CSS概述,进入JavaScript
查看>>