44-卡尔曼滤波器基本原理

1、 马尔科夫链
2、 状态机
3、 概率加权
4、 示例
5、 工程模型
6、 工程模型实例
7、 Matlab实现实例

卡尔曼滤波,和傅立叶变换、泰勒级数一样,是用卡尔曼的名字命名的。
它的基础是Wiener的维纳滤波理论,但维纳滤波需要用到无限个过去的数据,并不适用于实时处理。
而卡尔曼把状态空间模型引入滤波理论,从而克服这一缺点。

1、 马尔科夫链

如果当前状态St仅仅与上一个状态St-1有关,而与上上个状态St-2无关,更与上上上个状态St-3没有关系…,那么这些状态就是马尔科夫链。
马尔科夫过程已经非常成熟的应用于语音识别、输入预测等等。比如在搜索框里输入清华,则可以自动填补出后面大学两个字,等等。

马尔科夫过程适合使用状态及描述。

2、 状态机

卡尔曼的空间模型其实就是状态机。

例如,LabVIEW里面最重要的一个design pattern就是state machine状态机:
当前状态转换,依赖于上一状态。

再例如单片机,其串口通讯协议一般都用状态机模型来组包:
当前接收的hex字符是不是有用数据,这要考虑上一个状态。当前字符需要根据上一状态,才能决定是有用数据、用于组建命令字,还是无用数据、可以直接丢弃:
命令字组包

3、 概率加权

卡尔曼滤波器是一个最优化的自回归算法,目标是最小均方误差,基本思想是采用信号与噪声的状态空间模型,利用前一时刻地估计值和现时刻的观测值来更新状态变量的估计值。
这有些智能算法的味道,比如遗传算法,不同之处在于卡尔曼没有用到随机数。

这个滤波算法在近几十年来已经应用到机器人导航、传感器数据融合等场景,最近年来也被应用于计算机图像处理,例如人脸识别、图像分割等。

总结:
卡尔曼主要是:一状态机、二概率加权、三迭代。

4、 示例

验证卡尔曼滤波,最好是用ds18b20温度传感器,搭上一块单片机开发板,尝试预测一下房间的温度试试,预测结果准确与否,立刻可以检验。
用来校正小车或者飞行器的姿态作示例,反而一时不容易看到直接效果。

假设研究对象为某房间的温度。
一、根据已有经验房间温度变化是缓慢的、甚至可认为恒定,也就是说,下一时刻温度等于现在时刻的温度。但是这个经验并不是百分百可靠,还可能有上下几度的偏差,这些偏差可以看作高斯白噪声,即偏差跟前后时间没有关系、而且高斯分布,此时就有了预测温度和预测偏差

二、另外房间里放置有一支温度计(观测器),但是温度计也不十分准确,测量值与实际值也有偏差,偏差也呈高斯白噪声,此时就又有了观测温度和观测偏差

三、那么在任意一时刻都存在两个温度值和两个偏差,一是根据经验的预测值和预测偏差,二是观测设备的观测值和观测偏差,而卡尔曼根据这两对值,就可以估算房间的最优温度和最优偏差,这又有了第三组数据。

四、注意,涉及的温度:预测温度、观测温度、最优(估算)温度。

下面以k时刻的估算为例。

已知:上一状态k-1时刻已经有估算出来的最优温度为23度最优偏差为3度,预测温度NA度预测偏差4度,当前状态k时刻的观测温度25度观测偏差4度,那么:

一、使用上一状态k-1时刻的数据。根据过去k-1时刻的最优温度23度,直接可得现在k时刻的预测温度等于23度,由k-1时刻最优温度23度的最优偏差是3度和k-1时刻预测温度NA的预测偏差是4度,间接可得当前状态k时刻的预测偏差为sqrt(3^2+4^2)=5度,这样当前状态k时刻的预测温度23度和预测偏差5度均已获得。

二、使用当前状态k时刻的数据。根据温度计得到当前k时刻的观测温度(例如25度),同时该观测温度的观测偏差是4度。这样当前状态k时刻的观测温度25度和观测偏差4度均已获得。

三、上两步已经获得当前状态k时刻的预测温度和观测温度两组数据,现在需要求取最关键的最优温度。对于由k-1时刻得来的预测值23度和根据k时刻温度计所得的观测值25度,应该相信预测多一点还是相信观测多一点,这需要用到协方差来判断,用的是卡尔曼增益Kg Kalman Gain,Kg大代表误差大的一方,它会反方向的增大误差小的那一方的可信度,即Kg的权重总是乘在较可信的那一方,你的误差越大给对方乘的权重越大。

首先构建卡尔曼增益Kg = sqrt[ 5^2/(5^2+4^2) ] = 0.78,通过 0.78*25 + (1-0.78)*23 = 24.56,就可以估算出当前状态k时刻的最优温度24.56度。

然后由sqrt[ (1-Kg) * 5^2 ]=2.35度,就可以估算出最优温度的最优误差是2.35度。这样,当前状态k时刻的最优温度24.56度和最优偏差2.35度均已获得。

四、可以看出,因为预测偏差比较大(5度)、观测设备温度计的covariance比较小(4度),所以还是比较相信温度计的观测数据,结果也表明估算的最优温度值是偏向温度计的观测值的。

五、重新列一遍,回忆一下由k-1时刻到k时刻的情况:

上一状态k-1时刻的最优温度为23度最优偏差为3度,预测温度NA度预测偏差4度,当前状态k时刻的观测温度25度观测偏差4度,

那么此时由k时刻到k+1时刻(黑体是发生变化了的数据):当前状态k时刻的最优温度为24.56度最优偏差2.35预测温度23度预测偏差5度

如果下一状态K+1时刻有了观测温度?观测误差4度,就可估算出k+1时刻的数据。如果有了K+1时刻就可估算出K+2时刻…手工演算两行:

手工演算

其实就是迭代重新进入步骤一。

如果把分钟替换为天,把房间温度替换为城市温度,这其实就是一个简易的天气预报的模型。

5、 工程模型

工程系统上的卡尔曼滤波器算法,最核心的有5个计算公式。

首先,对于离散控制过程的系统,可用一个线性随机微分方程来描述:

X(k) = A*X(k-1) + B*U(k) + W(k)——关于系统的

Z(k) = H*X(k) + V(k)——关于观测的

X(t)是t时刻的系统状态,U(t)是t时刻对系统的控制量如果没有控制就是零,AB是过程参数,W(t)为过程噪声也就是预测偏差。Z(t)是t时刻的测量值,H是测量系统参数,V(t)为测量噪声也就是观测偏差。W(t)和V(t)两个噪声假设为高斯白噪声,它们的协方差分别是Q、R。

一、根据上一状态k-1时刻计算当前状态k时刻的预测值:

X(k|k-1) = A*X(k-1|k-1) + B*U(k) ——(1)

X(k-1|k-1)是上一状态k-1时刻已经估算出来的最优值,X(k|k-1)是利用k-1时刻预测k时刻的预测值,U(k)为当前状态k时刻的外加控制量、没有外部控制则为0,通过这个式子就更新了系统的状态。

二、还需要更新当前状态k时刻的预测值X(k|k-1)的协方差P:
P(k|k-1) = A*P(k-1|k-1) A’ + Q——(2)

P(k-1|k-1)是上一状态k-1时刻最优值X(k-1|k-1)的协方差,P(k|k-1)是当前状态k时刻预测值X(k|k-1)的协方差,Q是系统过程噪声的协方差即预测偏差。

三、然后由当前状态的观测值,结合预测值,得到当前状态k时刻的最优值X(k|k):

X(k|k) = X(k|k-1) + Kg(k)*(Z(k) – H*X(k|k-1)) ——(3)或者表达为:

X(k|k) = [I – Kg(k)*H] * X(k|k-1) + Kg(k)*Z(k) ——(3)

Z(k)是当前状态的观测值,Kg位卡尔曼增益,此时已经估算出了当前状态的最优值X(k|k) 。这个式子比较关键。

四、更新卡尔曼增益Kg:

Kg(k) = P(k|k-1) *H’ / (H*P(k|k-1) H’ + R)——(4)

P(k|k-1)是当前状态k时刻预测值的协方差,R是观测过程噪声即观测偏差。

五、虽然已经得到了k状态下最优数据X(k|k),但是为了迭代需要还要更新当前状态k时刻最优值X(k|k)的协方差:

P(k|k) =(I-Kg(k)*H) * P(k|k-1)——(5)

I为单位矩阵,或者对单变量就是标量1。

注意含义:P(k|k)是当前状态k时刻最优值的协方差,而P(k|k-1)是当前状态k时刻预测值得协方差。

六、不停递归即可:k、k+1、k+2…

6、 工程模型实例

前面上好佳实例里面,房间就是系统,对于该系统:只有一个变量,即温度;当前状态温度等于上一状态温度,所以系统参数A=1;没有外部控制,所以U(k)=0,系统参数B自然不需考虑。因此该系统的过程是:

X(k|k-1) = X(k-1|k-1)——式子1

上好佳实例里面,观测器就是温度计。因为温度计测量值就是温度不需变换,所以该系统的观测窗口H=1:

P(k|k-1) = P(k-1|k-1) + Q——式子2,Q过程噪声协方差

其他三个式子依次是:

X(k|k) = X(k|k-1) + Kg(k)*(Z(k) – X(k|k-1)) ——式子3或者表达为:

X(k|k) = [1 – Kg(k)] * X(k|k-1) + Kg(k)*Z(k) ——式子3

Kg(k) = P(k|k-1) / (P(k|k-1)  + R)——式子4,R观测噪声协方差

P(k|k) =(I-Kg(k)) * P(k|k-1)——式子5

7、 Matlab实现实例

m代码:
卡尔曼滤波器matlab实现

效果:
卡尔曼滤波器matlab实现效果

对于这种简单温度预测的算法,用C实现比较简单。

补充:
以上的协方差是广义的,很多时候就是方差,不是协。一个变量的方差可以理解成该变量和变量本身的协方差,并没错误。

42 – 贝叶斯滤波到卡尔曼滤波

1、 正态分布
3、 模型假设
4、 模型方程
5、 模型参数
6、 算法伪代码
7、 贝叶斯推导
8、 结束
————-

把前面的离散贝叶斯滤波器:
BEL(xn) = K*p(yn|xn) * ∑[ p(xn|tn, xn-1) BEL(xn-1) ]
应用在连续系统就是:
BEL(xt) = K*p(yt|xt) * ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1)
即:
求和为积分、离散n为连续t,动作t用u代替避免时间序列符号t。

为了实用和计算效率, 需要对BEL(x)进行分布假设。

例如:
假设BEL(x)服从正态分布,则不再需要逐点采样并计算xt,只要随时掌握均值和方差两个参数,就可以获得BEL(x)的全部信息了,这样把对xt逐点的迭代计算变为两个参数的迭代计算。这样就成为了“卡尔曼滤波器”。

1、 正态分布

一元正态分布:
p(x) ∼ N(μ,σ 2 ), 即:
p(x) = 1/[sqrt(2π)*σ] * exp[ −1/2*(x−μ)^2/σ^2 ]

正态分布的特点:
分布的形态完全由一阶矩即均值和二阶矩即方差完全决定。
正态分布的线性组合仍为正态分布。

3、 模型假设

卡尔曼滤波解决的是动态系统的状态追踪问题,基本假设是:
状态方程是线性的。
观测方程是线性的。
过程噪声符合零均值高斯分布。
观测噪声符合零均值高斯分布。
这样保证了一直在线性空间中操作高斯分布,状态的概率密度符合高斯分布。

4、 模型方程

xt = At*xt−1 + Bt*ut + εt
Pt = AtPt-1At` + Rt
yt = Ht*xt + δt

5、 模型参数

xt: n*1的向量,对应在t时刻1…n个状态量的均值,例如门1开、门2开…
yt: m*1的向量,表示在t时刻的1…m的传感器的观测值,例如测距仪1、测距仪2…
ut: l*1的向量,表示在t时刻的l…l个输入动作
εt: n*1向量,过程噪声,符合零均值高斯分布
δt: m*1观测噪声,符合零均值高斯分布
Rt: n*n矩阵,表示过程噪声εt的方差矩阵
Qt: m*m矩阵,表示观测噪声δt的方差矩阵
At: n*n矩阵,表示n个状态量从t−1到t在没有输入影响时的转移方式
Bt: n*l矩阵,表示在t时刻ut对状态xt的影响
Ht: m*n矩阵,表示状态xt如何被转换为观测yt
Pt: n*n的差矩阵,表示t时刻被观测的1…n个状态量的方差。
Kt: n*m增益矩阵,这增益矩阵式卡尔曼纳的核心

6、 算法伪代码

KALMAN_FILTER( xt-1,Pt-1, ut,yt):
prediction:
xt_bar = At*xt-1 + Bt*ut <---预测t时刻状态,基于状态转移矩阵At和输入控制ut Pt_bar = At*Pt*A`t + Rt <---预测方差矩阵, correction: Kt = Pt_bar*H`t* (Ht*Pt_bar*H`t +Qt)^-1 <---更新增益矩阵,观测噪声方差Qt越大增益Kt越小 xt = xt_bar + Kt(yt - Ht*xt_bar) <---更新状态,基于新的观测信息 Pt = (I - Kt*Ht)*Pt_bar <---更新状态的方差矩阵。 END 其中:下标_bar为计算均值,上标`为转置,^-1为逆。 倒数第二个式子:xt = xt_bar + Kt(yt - Ht*xt_bar) (yt − Ht*xt_bar)表示观测值yt与预测值Ht*xt_bar的差; 再乘子Kt,表示观测yt的噪声大的的话,就采信的比较小。然后拿这个小的修正xt_bar。 即增益和噪声相反趋势。 相反,如果观测yt的噪声比较小,预测Ht*xt_bar的误差比较大,则乘以Kt后的修正幅度比较大,因为观测的噪声小、可靠。 再如果,观测yt的噪声小、预测的Ht*xt_bar的误差也小,那么修正幅度也不大。 总结: 就是利用观测数据修正预测数据。 准确的观测的修正量大,不准确的观测的修正量小。 所以误差较大的时候能快速修正,在误差较小时能逐渐收敛。 7、 贝叶斯推导 7.0 基础是基于: 离散贝叶斯滤波: BEL(xn) = K*p(yn|xn) ∑[ p(xn|tn, xn-1) BEL(xn-1) ] 应用在连续系统: BEL(xt) = K*p(yt|xt) * ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1) 7.1 系统初始状态是: BEL(x0) = N(miu0, P0 ) 7.2 预测过程 状态转移模型是: xt = At*xt−1 + Bt*ut + εt 由于这是个线形函数,所以从xt−1 到 xt的状态转移概率(条件概率)也高斯分布: *** p(xt|ut,xt-1) = N( At*miu_t-1 + Bt*ut, Rt) 根据连续系统的贝叶斯滤波公式: BEL(xn) = K*p(yt|xt) * ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1) 抛开前者的更新部分,使用后者的预测部分,来预测均值: BEL(xn) = ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1) 由于卡尔曼滤波的基本假设就是把贝叶斯滤波的BEL(x)假设为高斯分布,所以: *** BEL(xt-1) = N(miu_t-1, Pt-1) 这个***,结合前面那个高斯分布的***: p(xt|ut,xt-1) = N( At*miu_t-1 + Bt*ut, Rt) 所以预测部分的: BEL(xt)_bar = ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1) 就是两个高斯分布***的卷积: BEL(xt)_bar = ∫[ N( At*miu_t-1 + Bt*ut, Rt) * N(miu_t-1, Pt-1) ]d(xt-1) 依然是高斯分布。 根据正态分布定义计算得,其这个高斯分布的参数为: miu_t_bar = At*miu_t-1 + Bt*ut xigema2_bar = At*Pt*At` + Rt 即: BEL(xt)_bar = N( At*miu_t-1 + Bt*ut, At*Pt*At` + Rt ) 由于是预测,是均值,有bar。 7.3 观测过程 根据卡尔曼滤波器中的观测方程: yt = Ht*xt + δt 所以p(yt|xt)这个条件概率部分是一些高斯分布的线性组合: *** p(yt|xt) = N(yt; Ht*xt, Qt) 这里多出的yt;是用来表示这个计算需要用到yt。 根据连续系统的贝叶斯滤波: BEL(xt) = K*p(yt|xt) * ∫[ p(xt|ut, xt-1)*BEL(xt-1) ]d(xt-1) 这里考虑观测过程,即根据新数据yt更新xt,而需要预测的xt-1: BEL(xt) = K*p(yt|xt) * BEL(xt)_bar 这也是俩高斯分布的乘依然是高斯分布只不过两个参数的形式复杂一些。 由7.2已经有: *** BEL(xt)_bar = N(xt; miu_t_bar, Pt_bar) 结合前步骤的: *** p(yt|xt) = N(yt; Ht*xt, Qt) 得到新高斯的两个参数: miu_t = ut_bar + Kt*(yt − Ht*miu_t_bar) xigema2 = (I - Kt*Ht)*Pt_bar 其中Kt==Pt_bar*Ht`* (Ht*Pt_bar*Ht`+Qt)^-1 即: BEL(xt) = N( ut_bar + Kt*(yt − Ht*miu_t_bar) , (I - Kt*Ht)*Pt_bar ) 由于是更新,确定值,所以没有bar。 8、 结束 6的算法, 来自7的推导。 过程噪声矩阵Rt和观测噪声矩阵Qt的影响及调节: 这两者实际上是相对的,表示更相信观测传感器还是更相信预测模型。 使用时一般先根据传感器例如激光雷达的手册确定R,然后再根据R确定Q。 如果更相信观测数据,往小处调Q;如果不放心观测传感器,往大了调Q。 这样Q越大表示越不相信观测系统状态越容易收敛,对观测数据的响应越慢。 REF: http://blog.csdn.net/heyijia0327/article/details/17487467

37 – 贝叶斯滤波

1、 全概率公式
2、 贝叶斯公式
3、 贝叶斯公式解释
4、 公式的简化
5、 多观测数据融合
6、 动作的影响
7、贝叶斯滤波
————-

1、 全概率公式

p(x) = ∑ p(x|y)p(y) OR p(x) = ∫p(x|y)p(y)dy

全概率公式的意义是:
如果直接计算p(x)困难,而存在yi恰好可以两两互斥的划分样本空间, 并且p(yi)的计算更简单,就可以利用全概率公式计算p(x)。

全概率公式的思想是:
将事件x分解成几个小事件,求这各个小事件的概率,对其相加,从而求得事件x的概率。

所以,在将事件x进行分割时,不是直接对X进行分割,而是先找到样本空间的一个划分y1,y2…yn,这样事件X就被分解成了事件xy1,xy2…xyn这样n部分,即x = xy1+xy2+…+xyn, 每一个yi的发生可能导致x发生的概率是P(x|yi)。

例如:
甲、乙、丙三台机床次品率为5%,4%,2%,这三台的产出量占总体的25%,35%,40%,在总体产品任取一个产品为次品的概率?
p(x) = 25%*5%+4%*35%+2%*40%=0.0345

2、 贝叶斯公式

由条件概率公式: p(x|y) = p(x,y) / p(y)
并结合乘法公式: p(x,y) = p(x|y)p(y) = p(y|x)p(x)
可得贝叶斯公式: p(x|y) = p(y|x)p(x) / p(y)

贝叶斯公式与全概率公式解决的问题是相反的:
它是建立在条件概率的基础上寻找事件发生的原因,即大事件y已经发生的条件下,分割中的小块事件xi的概率。

假设xi是样本空间的一个划分,这些xi通常是结果y出现的原因之一;
p(xi)表示各种原因出现的可能性大小,称先验概率;
p(xi|y)反映了在结果y出现之后,再对各种原因xi概率的新认识,称后验概率。

例如:
发报机以概率0.6和0.4发出信号+和-。由于干扰,发+时收报台以概率0.8和0.2收到信号+和-,发-时收报台以概率0.9和0.1收到信号-和+。现收报台收到+,问发报机确实发出+的概率?
p(x=+|y)= (0.6*0.8)/(0.6*0.8+0.4*0.1) = 0.923

3、 贝叶斯公式解释

贝叶斯公式:
p(x|y) = p(y|x)p(x) / p(y)

这里:
x一般是某种状态。
y一般是某种观测。
p(x)这个先验概率,是对x的先验知识,例如一扇门开着的概率为50%。
p(y|x)这个条件概率,意思是由状态x已知可以推算观测数据y的概率这种因果关系。例如已知门开状态,则测距仪读数z=0.6m;若门关的话,测距仪数据z=0.3。
p(x|y)这个后验概率,是基于观测数据获取后而对状态的推断,它是由先验概率和从因到果的条件概率而计算出来的。

例如图中示例:
机器人的测距仪读数z=0.5m,问门的状态开open或非开~open的概率?
p(door=open|z=0.5) <---这里的后验概率p(open/z)由下一行的贝叶斯公式计算 = ∑[p(z|open)p(open)] / p(z) <--- 这里的观测数据概率p(z)由下一行的全概率公式计算 = 0.6*0.5 / ∑[ p(z|door)p(door)] = 0.3 / ( p(z|door)p(door=open) + p(z|door)p(door=~open) ) = 0.3 / (0.6*0.5 + 0.3*0.5) = 2/3 这里p(z)的全概率计算,=p(z|door)p(door=open) + p(z|door)p(door=~open) = 0.6*0.5 + 0.3*0.5, 可见仅基于先验概率和条件概率,是常数项了, 所以有简化计算方法。 4、 公式的简化 贝叶斯公式: p(x|y) = p(y|x)p(x) / p(y) 式中分母p(y)常项可以归一化系数处理, 成为: p(x|y) = p(y|x)p(x) / p(y) = K p(y|x) p(x) (由全概率得此处K = 1/p(y) = 1/∑ p(y|x)p(x) ) 5、 多观测数据融合 单一传感器或单次数据y未必可靠, 有时要融合多个传感器数据或单传感器的多个读数y1,y2...来确定x的状态。 继续上面示例: 机器人又读了第二次,测距仪读数z=0.5m,问门的状态开open或非开~open的概率? 要注意此时门状态概率已经不是开50%关50%,而是由于有了第一次的观测读数,已经变为开2/3关1/3这样的概率分布了。 (前面求出来的后验概率2/3,这里就成先验概率了。) p(door=open|z=0.5) <---这里的后验概率p(open/z)由下一行的贝叶斯公式计算 = ∑[p(z|open)p(open)] / p(z) <--- 这里的观测数据概率p(z)由下一行的全概率公式计算 = 0.6*2/3 / ∑[ p(z|door)p(door)] = 0.4 / ( p(z|door)p(door=open) + p(z|door)p(door=~open) ) = 0.4 / (0.6*2/3 + 0.3*1/3) = 4/5 可见增加的第二个观测数据把门处于开状态的概率由2/3提高到4/5。 以下公式推导, 对于贝叶斯公式: p(x|y1) = p(y1|x)p(x) / p(y1) 如果增加第二个新的观测数据y2: p(x|y2,y1) <---根据条件概率公式 = p(x,y2,y1)/p(y2,y1) <---对分子第一项根据乘法公式 = p(y2|x,y1)p(x,y1)/p(y2,y1) <--- 对分子第二项根据乘法公式 = p(y2|x,y1)p(x|y1)p(y1)/p(y2,y1) <--- 对分母根据乘法公式 = p(y2|x,y1)p(x|y1)p(y1)/p(y2|y1)p(y1) <---消项 = p(y2|x,y1) p(x|y1) / p(y2|y1) 再增多观测数据的话,可把上式的y1扩展为观测数据y1,y2,...yn-1,y2为最后增加的这个观测数据yn: p(x|yn,…,y1) <--- 带入上式 = p(yn|x,yn-1,…,y1) p(x|yn-1,…y1 ) / p(yn|yn-1,…y1 ) <---yn和yn-1,...y1无关 = p(yn|x) p(x|yn-1,…y1 ) / p(yn|yn-1,…y1 ) <---移动个位置 = p(yn|x) / p(yn|yn-1,…y1 ) * p(x|yn-1,…y1 ) <---第一项的分母常数项 = Kn p(yn|x) * p(x|yn-1,…y1 ) <---最后一项就可以同型迭代了 = Kn p(yn|x) * Kn-1 p(yn-1|x) *... * p(x|y2,y1) = Kn p(yn|x) * Kn-1 p(yn-1|x) *... * K2 p(y2|x) * K1 p(x|y1) = Kn*Kn-1...K1 * p(yn|x)*p(yn-1|x)...p(y1|x) * p(x) 这里p(x)是已知的先验概率,例如门开概率4/5; p(y1|x)为已知的条件概率,例如门若开激光测距仪应读数为0.6m(y1)、门若开红外测距仪读数应为0.9m(yn)、...等。 6、 动作的影响 以上对于系统已经讨论了自身状态x, 传感器观测y,但缺少控制动作t。 在Bayes模型中的动作t的影响,也就是在x′状态下执行动作t后状态改变到x的概率: p(x|t,x′)。 动作对状态的影响, 一般用状态转移模型描述。
上图转移模型表示了关门动作对状态的影响。既:如果门处于开状态,关门动作后门有0.9的概率成功处于关状态、有0.1的概率失误仍保持为开状态;若门是关状态,执行关门动作后有1.0概率出于关闭状态、有0概率出于开状态。

那么执行动作后的状态xn的概率计算,要考虑动作t之前的所有状态xn-1,即使用权概率公式:
p(x|t)= ∑ p(t|t,xn-1)p(xt-1)

继续前例:
在经过两次传感器观测后已经计算获得门开概率为4/5,此时执行一次关门操作,动作之后门开的概率多少?

p(door=open|t,x)
= ∑ p(open|t,xn-1)p(xt-1)
= p(open|t,open)p(d=open) + p(open|t,close)p(d=close)
= 0.1*4/5 + 0*1/5
=0.08
执行一次关门动作后,门状态为开的概率是0.08。

7、贝叶斯滤波

对一个系统:
有了系统状态:p(x),这个先验概率分布。例如门开门关的概率分布
有了观测模型:p(y|x),这个条件概率。例如门若开测距仪数据0.6m若关闭数据0.3m
有了状态模型:p(x|t,x′),这个可用全概率计算的状态转换图。
还有了1…n时刻的观测和动作数据::Dn–> {t1,y1,…tn,yn}

那么,就可以计算输出的后验的状态概率:
BEL(xn) = p(xn |t1,y1,…tn,yn)
这个BEL是believe,置信的意思。

这个滤波器需要一些假设:
n时刻的观测yn,仅决定于n时刻的状态xt,与xt-1、xt-2无关。
n时刻的状态xn,决定于n−1时刻的状态xn-1和n时刻的动作tn,与xn-2、xn-3…无关。
以上即马尔科夫性,还要假设:
模型的噪声相互独立。
观测的噪声相互独立。

贝叶斯滤波的迭代形式:
BEL(xn)
= p(xn |t1,y1,…tn,yn) <--根据多观测的贝叶斯公式,置换yn = K*p(yn|xn,t1,y1,...tn) p(xn|t1,y1,...tn) <--根据马尔科夫性,yn与t1,y1,...tn无关 = K*p(yn|xn) p(xn|t1,y1,...tn) <--根据状态转移概率对xn求全概率,xn-1互斥划分样本空间 = K*p(yn|xn) ∑[ p(xn|t1,y1,...tn-1,yn,tn, xn-1) p(xn-1|t1,t1,...tn-1,yn-1,tn) ] <--根据马尔科夫性,xn仅与xn-1和tn有关 = K*p(yn|xn) ∑[ p(xn|tn, xn-1) p(xn-1|t1,t1,...tn-1,yn-1,tn) ] <--根据马尔科夫性,xn-1和tn也无关 = K*p(yn|xn) ∑[ p(xn|tn, xn-1) p(xn-1|t1,y1,...tn-1,yn-1) ] <--后面这就出现迭代形式 = K*p(yn|xn) ∑[ p(xn|tn, xn-1) BEL(xn-1) ] 可见,贝叶斯滤波器,最终表现成两部分: 对于观测数据,则更新状态,p(yn|xn) ,基于新的观测数据更新了yn|xn这个条件概率分布。 对于动作数据,则预测状态,∑[ p(xn|tn, xn-1) BEL(xn-1) ],基于转移模型xn−1、tn预测了xn的条件概率分布。 伪代码: FILTER( BEL(x), D ): K=0 IF D is sensor data then: FOR all x do: BEL_NEW(x) = p(y|x)BEL(x) K = K+BEL_NEW(x) FOR all x do: BEL_NEW(x) = BEL_NEW(x) / k ELSEIF D is action command then: FOR all x do: BEL_NEW(x) = ∑[ p(x|t,x') BEL(x') ] ENDIF return BEL_NEW(x) 从代码可见: 如果要进行状态预测,需要遍历所有可能的x′状态,计算量很大。 而且如果BEL(x)是任意分布,更需要在xn所有可能取值点上计算该取值的概率,实现很难。 所以, 在应用时一般要对BEL(x)的分布进行假设来近似,从而衍生一些实用算法: 卡尔曼滤波 KF, 信息滤波 IF, 粒子滤波 PF。 REF: http://in.ruc.edu.cn/pc2016/

35 – 贝叶斯学习

1、 贝叶斯统计
2、 贝叶斯分析
3、 贝叶斯决策
4、 朴素贝叶斯的分类算法
5、 最大似然估计和贝叶斯估计
6、 示例 – 似然函数
7、 示例 – 后验概率


1、 贝叶斯统计

案例:
驾驶员车窗结露看不清前方、仅依靠后视镜、发现后车亮起了右转向灯,问:此时本车处在右转车到(即需要右转)的概率是多少?

用A表示本车位于右转道路口,B表示后车右转向灯亮,则:
先验概率P(A) :
即没有依靠其他信息、此时在此路段碰到了右转车道的概率。这根据这个路段位于北京还是西藏区别很大。
条件概率P(B|A):
即处于右转路口,而且又主动打右转向灯的概率。 因为当然有司机在右转道要转弯、但是却不打转向灯,还有的不在右转车道,却也打着右转向灯不停,这些情况都有。
后验概率P(A|B):
即需要求解的看到了右转向灯亮、而且位于右转车道,这个后验概率。

上面的先验概率P(A)、条件概率条件概率P(B|A)、最终得到后验概率P(A|B),是贝叶斯统计的三要素。

根据P(A)、P(B|A),就可以由贝叶斯定理:
P(A|B) = P(B|A)P(A) / P(B)
计算出看到右转灯亮、且处于右转车道路口这个后验概率P(A|B)。

2、 贝叶斯分析

贝叶斯分析是根据证据的积累来推测一个事物发生的概率,当预测一个事物时,需要先根据已有的经验和知识推断一个先验概率, 然后在新证据不断积累的情况下调整这个概率,这个通过积累证据从而得到一个事件发生概率的过程,称为贝叶斯分析。

理解贝叶斯分析最好的方法是图像法, 这图里,红圈A占大圈的比例,即先验概率P(A), 小阴影AB占蓝圈B的比例,即后验概率P(A|B)。
贝叶斯分析

先验概率,即取得证据之前的概率P(A),这个通常来自之前的经验常识,带有一定的主观色彩。
注意: 先验概率在贝叶斯统计中具有重要意义,不可忽视。

例如:
发现一些没读过书的人很有钱,事实是当发现时就已经是幸存者了(对应上图中的红圈), 而死了的人(红圈外的大部分面积)都忽略了啊。
再例如:
由一个人着装雅致,推断他是大学教授还是工程师,这里也得仔细注意先验了,即:在整个人群中大学教授多、还是工程师多,也就是红圈和大圈的关系。

这个图,红圈和篮圈的比例, 很少能在开始就知道, 这是应用的难点:
回前面案例,
如果恪守先验概率,就会无视变化、墨守成规、直接忽视右转向灯亮的信号;
如果过于注重特例,完全不看先验概率,很可能把噪声当成信号,看到灯就转向。

A即位于右转车道,
B是看到后车右转向灯亮,
A|B即右转向灯亮且位于右转车道,
B|A是位于右转路口且打起右转向灯。

这个案例里:
根据路段位于北京繁华区域、结合经验、设定:
P(A)=5%,即:这条路段5%可能是右转车道,其余95%部分是直行车道、或者处在左转车道。
P(B|A)=20%,即:位于右转车道的人20%会打起右转向灯,其余的呢可能是从右转道直行走了、或从右转道左转了、或者从右转道确实右转了但是没打右转向灯。

那么如果假设P(B) = 2%, 即在整个车辆行驶过程中,有2% 的概率右转弯灯亮了。

那么复制一下贝叶斯定理:
P(A|B) = P(B|A)P(A) / P(B)
换一下;
P(A|B) = P(A) * P(B|A)/ P(B)
= 5% * 20%/2% = 50%

可见:
原来的先验概率P(A)=5%,即此时恰好位于右转车道的概率为5%,并不高;
而由于公式右侧一项的贡献、即看到右转向灯亮, 则后验概率P(A|B)提升到了50%。

即:
新信息出现之后的A的概率 = 原来A的概率 * 新信息带来的调整。

新信息出现前:
贝叶斯学习
新信息出现后:
贝叶斯学习

3、 贝叶斯决策

基于贝叶斯分析,可以引出贝叶斯决策,它主要包含四部分:
数据D、假设W、目标O、决策S。

此处:
数据,即之前讲到的证据,
假设,是要验证的事实,
目标,是最终要取得优化的量,
决策,是根据目标得到的最后行为。

一般步骤是:
理清因果:哪个是假设、哪个是证据,
给出所有可能假设、即假设空间,
给出先验概率,
根据贝叶斯公式求解后验概率,得到假设空间的后验概率分布,
利用后验概率求解条件期望,得到条件期望最大值对应的行为。

以上转化成算法就是机器学习。

4、 朴素贝叶斯的分类算法

案例:
给出某人的身高和体重,判断其性别?

首先:证据是身高和体重,假设是性别男类型,
其次:先验概率是人口中的男女比例,条件概率是男性和女性的身高和体重分布。
然后,可以根据贝叶斯公式求解后验概率。
最后,要做的决策是性别分类,目标是分类错误率最低。

贝叶斯决策是构建有监督机器学习的重要基础。
例如前述性别问题:
在训练部分,根据已有数据求出不同性别对应身高和体重的概率分布;
在测试部分,用朴素贝叶斯分类器进行决策。

5、 最大似然估计和贝叶斯估计

事实上, 贝叶斯决策很少只涉及A和B,而是内部包含非常关键的隐变量(参数),涉及对所研究事物的一些基本预设。

例如最简单的:抛硬币10次、出现9次正面1次背面,对这个问题:
频率学派,认定出正面的概率为0.5不变,否定0.5的想法是匪夷所思;
贝叶斯学派,需要把这个(隐)变量看成是未知的参数(具有一定先验概率),之后按照贝叶斯公式调整新加入证据对先验概率的影响。

要注意:
此处先验概率十分重要,它影响决策的结果,因为:
如果先验的认为出正面概率为0.5,那么需要得到大量偏离0.5的证据之后,才能逐步纠偏。

总结:
最大似然估计把参数看做是确定(非随机)而未知的,最好的估计值是在获得实际观察样本的概率为最大的条件下得到的。
贝叶斯估计是把参数当做具有某种分布的随机变量,样本的观察结果使先验分布转换为后验分布,再根据后验分布修正原先对参数的估计。
这两者在结果上通常是近似的,但概念上它们的处理方法完全不同。

6、 示例 – 似然函数

游戏规则:
押一块钱,可以抛10次硬币,出现正面的次数小于等于6次、就赢得一块钱,大于6次正面则输掉的一块钱。

定义随机变量:
Y :表示出现正面的次数
X :表示一局输赢结果
X = :
1 if Y<=6 0 if Y>6

赢了之后,一块钱就变成了两块钱;输了之后,一块钱就变成了没有钱;
定义函数f(X)表示游戏之后的结果:
f(X)= :
2 if X=1
0 if X=0

增加常识:
* 抛硬币出正面的概率,等于出现反面的概率,等于0.5。
* 第一次抛硬币的结果 不会影响 第二次抛硬币的结果,验的结果是相互独立的。
* 这是一个可重复的试验,结合上面这点就是一个独立可重复试验。

二项分布常用来对独立可重复实验进行概率建模,所以这个抛硬币服从二项分布B(N,p)。
N是进行的实验的次数10,p可以用r代替表示抛一次硬币出正面的概率在这里是r=0.5,用Y表示出现正面的次数,则:
P(Y=y) = C(N,y)* r^y * (1-r)^(N-y)

根据假设:
N=10,r=0.5,得P(y<=6) = P(y=0)+…P(y=6) =0.8281,意味着有0.8218的概率赢。 赢到的数额期望是: E{f(x)} = 2*0.8281 + 0*(1-0.8281) = 1.6562 也就是说在抛硬币出现正面和反面概率相同都为0.5的情况下,根据游戏规则最终能得到1.6562块钱。 上面,最重要的先验信息是: 抛一次硬币,出现正面和反面的概率是一样的都为0.5。 现在,换种思路: 万一硬币被做了手脚,抛出正面的概率不是0.5呢? 如果按照贝页斯分析,需要把r也视为一个随机变量,那么N次独立重复的抛硬币实验的概率分布函数,可写成条件概率的形式: P( Y=y|r,N) = C(N,y) * r^y * (1-r)^(N-y) 此时,在 r 未知的情况下,拿到了一组实验数据(样本信息),有个人他抛了10次硬币,出现了9次正面1次反面。 那么还有多少理由相信r=0.5? 由二项分布概率密度: P( Y=y|r,N) = C(N,y) * r^y * (1-r)^(N-y) 那么r为多少才能让P(Y=y|r,N)在y=9时取最大值? 去对数不影响指数函数的单调性: L = ln P(Y=y|r,N) = ln C(N,y) + y*ln(r) + (N-y)*ln(1-r) —>MAX
L可称为对数似然函数。

对r求偏导数即获得极值点:
dL/dr = y/r – (N-y)/(1-r)
这里用d表示偏导。

当y为9时,r=0.9。

此时:
得P(y<=6) = P(y=0)+…P(y=6) =0.0128,意味着游戏有0.0128的概率赢。

此时的期望:
E{f(x)} = 2*0.0128+ 0*(1-0.0128) = 0.0256
也就是说在抛硬币出现正面概率为0.9的情况下,根据游戏规则最终能得到0.0256块钱。

以上过程是:
首先,先验分布设定为0.5,
然后,确定模型为二项分布,
以及,模型参数为r,
最后,似然求解得参数为0.9。

7、 示例 – 后验概率

REF:
http://www.woshipm.com/pmd/421033.html
http://www.cnblogs.com/hapjin/p/6653920.html
https://www.zhihu.com/question/19725590/answer/217025594