“很多时候一些算法看起来极其复杂,极其难懂。不是因为我们愚不可及。而是因为我们看到的已经是别人省略过很多步骤和省略很多脑海中思考过的思路最后呈现出的公式和文字。而好的博客就是应该尽量还原这些思考过程以及省略掉的步骤。”——
@司南牧
像卡尔曼滤波(Kalman filters)、粒子滤波(Particle filters),隐含马尔科夫模型(Hidden Markov models),动态贝叶斯网络(Dynamic Bayesian networks)等等算法。这些算法是贝叶斯滤波算法的具体实现.因此学好了贝叶斯滤波再学其他算法那就容易很多了。注意:贝叶斯滤波只提供了一种思想,卡尔曼滤波就是对这个思想的其中一种实现。
破解概念上的束缚之贝叶斯滤波算法到底有什么用?
学东西最烦的是看了半个月的算法细节,结果发现自己还是不知道这算法有什么用,怎么实现
。今天博主就开篇破解贝叶斯中的概念上的障碍。让大家快速学习贝叶斯滤波算法,并且能够用到自己的项目中。贝叶斯滤波算法
它做的工作就是根据已有的信息来计算概率。比如我想根据一些信息识别某个人性别是不是女,那贝叶斯滤波算法要做的是就是计算这个人是女的概率P(女)。来了新的信息就计算新的概率。
。如果你不理解这句话看接下来这个例子你就懂了。
假如现在贝叶斯滤波算法是要根据你已输入的信息分析某个人是男是女。贝叶斯滤波算法最终的输出是计算出根据现有信息判断这个人是男性的概率是多少,女性的概率是多少。然后你的算法就选择概率更大的那种情况输出结果。如果有新的信息进来(比如“那个人有长头发”),贝叶斯算法要重新计算这个人是男性的概率是多少,女性的概率是多少。
。
那它具体怎么做的呢?
当你什么信息都不提供给贝叶斯滤波算法的时候
,然后你问贝叶斯算法那个人的性别是女的概率是多少。贝叶斯滤波算法会告诉你P(女)=0.5。注意:P(女)=0.5这个表示的含义是“根据已有信息,那个人是女性概率是0.5”. 现在P(女)=P(男)=0.5我们是没法判断性别。这个数值“0.5”是我们设置的一个初始值,一般是需要根据你的统计经验设置的(如果你是想用贝叶斯滤波算法进行垃圾邮件识别,那么它是垃圾邮件这个概率肯定不会有0.5这么大。毕竟垃圾邮件还是少数。你需要统计收到的邮件中垃圾邮件的占比,然后作为算法的初始值。好让算法在没有任何提示信息的情况下能输出当前邮件是垃圾邮件的概率)。
然后,回到性别识别那个问题。
当你告诉算法这个人有长头发,你再问算法这个人现在性别是女的概率是多少
。贝叶斯滤波算法会根据概率论中的条件概率知识算出“在知道某个人有长头发的条件下,这个人性别是女的概率P(女)=0.87”。至于它到底怎么算的文章后面会讲。现在你只需要对整个算法有个直观理解即可。为什么它能知道根据“有长头发”这个信息来更新概率呢?
这是因为算法需要我们告诉它“长头发中女性占比是多少(这个叫做先验知识)”,P(女)=0.87这个也是需要我们经过统计才能得到的数据
。
当你再告诉算法这个人使用口红,然后你再问算法这个人现在性别是女的概率是多少
?贝叶斯滤波算法会根据概率论中条件概率知识,以及需要你告诉它“使用口红的人中女性占比是多少”,来更新当前这个人是女性的概率P(女)=0.91。
以上就是贝叶斯算法做的工作。现在我想聪明的你已经对贝叶斯滤波算法已经有了一个直观的理解。
我总结一下贝叶斯滤波算法做的工作:它做的工作就是根据不断接收到的新信息和我提供的一些已经知道的统计值,来不断更新概率。更新概率值的方法是根据概率论中的条件概率计算公式来更新的。贝叶斯滤波算法计算的结果是一个概率值有什么用呢
?
比如我要它根据我提供的一些信息识别某个人是不是女,那它就得计算这个人是女的概率P(女).如果我想让它根据雷达测距判断机器人离障碍物距离,那它就得计算出机器人离障碍物各种距离取值的概率(为何要计算概率?因为雷达测量会存在误差),比如计算机器人离障碍物10cm远的概率是0.87,离障碍物11cm远的概率是0.21,离障碍物9cm远的概率是0.01。那么我就认为机器人离障碍物距离是10cm。
贝叶斯滤波算法怎么随着收到的新信息来更新概率的?
还是以前面的根据已有信息识别性别例子举例。我们要想识别一个人是否是女性,现在要贝叶斯滤波算法做的就是需要它计算出根据当前信息判断当前这个人是女的概率P(女)。
我们
已经知道的先验知识是(这些数据是我们统计到的,你项目中的这些先验知识有些是需要统计得到,有些是需要建模比如假设它是正态分布等等)
:
在没有任何信息的情况下初始值:P(女)=0.5
留有长头发的人中女性占比:0.8。
使用口红的人中女性占比:0.9
那么
在没有任何额外信息的情况下,贝叶斯滤波认为当前这个人是女性的概率P(女)=0.5
当新知道当前这个人留有长头发这个信息时,怎么更新概率值呢?
此时当前这个人是女性的概率可以这么表示P(女|长头发), 这个表达式的意思是在知道现在这个人的长头发的条件下女性的概率。
事实上
这个值就是我们在先验知识中已知的“留有长头发的人中女性占比”,即0.8
。你会说万一我不知道留有长头发中的人之中女性占比呢?这意味着我们需要用概率论中的条件
概率知识
求解P(女|长头发)。(如果你对条件概率怎么求还不清楚可以参考这篇文章
十分钟复习概率论知识
)。根据概率论知识我们知道
P ( 女 ∣ 长 头 发 ) = P ( 女 并 且 有 长 头 发 ) P ( 长 头 发 ) = P ( 长 头 发 ∣ 女 ) P ( 女 ) P ( 长 头 发 ) P(女|长头发)=\frac {P(女 并且有 长头发)}{P(长头发)}=\frac {P(长头发|女)P(女)}{P(长头发)}
P
(
女
∣
长
头
发
)
=
P
(
长
头
发
)
P
(
女
并
且
有
长
头
发
)
=
P
(
长
头
发
)
P
(
长
头
发
∣
女
)
P
(
女
)
。所以我们有两种方式可以求P(女|长头发)。
-
如果我们知道长头发的人占总人口比例即P(长头发),并且还知道有长头发的女性占总人口的比例即P(女 并且有 长头发),那么就用
P ( 女 ∣ 长 头 发 ) = P ( 女 并 且 有 长 头 发 ) P ( 长 头 发 ) P(女|长头发)=\frac {P(女 并且有 长头发)}{P(长头发)}
P
(
女
∣
长
头
发
)
=
P
(
长
头
发
)
P
(
女
并
且
有
长
头
发
)
这种方式求留有长头发的人中女性占比P(女|长头发)。 -
如果我们知道长头发的人占总人口比例即P(长头发),而且还知道女性中留有长头发的人占比P(长头发|女),并且还知道女性占总人口比例P(女)。那么就用
P ( 女 ∣ 长 头 发 ) = P ( 长 头 发 ∣ 女 ) P ( 女 ) P ( 长 头 发 ) P(女|长头发)=\frac {P(长头发|女)P(女)}{P(长头发)}
P
(
女
∣
长
头
发
)
=
P
(
长
头
发
)
P
(
长
头
发
∣
女
)
P
(
女
)
这个方式求解。
你已知什么先验知识那就用什么方式求解,贝叶斯滤波通常是用
P ( 女 ∣ 长 头 发 ) = P ( 长 头 发 ∣ 女 ) P ( 女 ) P ( 长 头 发 ) P(女|长头发)=\frac {P(长头发|女)P(女)}{P(长头发)}
P
(
女
∣
长
头
发
)
=
P
(
长
头
发
)
P
(
长
头
发
∣
女
)
P
(
女
)
这种方式求解。这是因为这种方式在在实际应用场景中这个公式中需要的先验知识更容易获得。
你在实际实现贝叶斯滤波算法时候只需要考虑你能够知道公式中的哪些先验知识概率值,然后再确定用哪种方式求
P ( 女 ∣ 长 头 发 ) P(女|长头发)
P
(
女
∣
长
头
发
)
。
现在你已经学会了贝叶斯滤波算法
。
你一定会问那为何很多书上感觉贝叶斯滤波算法比这个复杂得多啊
。这是实际应用中往往是会同时接收到多个信息。即P(女|长头发, 有口红)这种形式,这个表示在知道一个人长头发,并且有口红的条件下它是女性的概率是多少。然后
书上或者博客省略了很多化简步骤直接告诉你
P ( 女 ∣ 长 头 发 , 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 ∣ 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P(女|长头发, 有口红)=\frac{P(长头发|女,有口红)P(女|有口红)}{P(长头发|有口红)}
P
(
女
∣
长
头
发
,
有
口
红
)
=
P
(
长
头
发
∣
有
口
红
)
P
(
长
头
发
∣
女
,
有
口
红
)
P
(
女
∣
有
口
红
)
。
省略了这么多当然这个你自然看不懂
,而且事实上有时候这种求P(女|长头发, 有口红)的方式里面的先验知识你压根就不知道,比如P(长头发|有口红)这个先验知识值你不知道怎么可能求出这个公式
P ( 女 ∣ 长 头 发 , 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 ∣ 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P(女|长头发, 有口红)=\frac{P(长头发|女,有口红)P(女|有口红)}{P(长头发|有口红)}
P
(
女
∣
长
头
发
,
有
口
红
)
=
P
(
长
头
发
∣
有
口
红
)
P
(
长
头
发
∣
女
,
有
口
红
)
P
(
女
∣
有
口
红
)
。
我将还原这个公式的推导过程
P ( 女 ∣ 长 头 发 , 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 ∣ 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P(女|长头发, 有口红)=\frac{P(长头发|女,有口红)P(女|有口红)}{P(长头发|有口红)}
P
(
女
∣
长
头
发
,
有
口
红
)
=
P
(
长
头
发
∣
有
口
红
)
P
(
长
头
发
∣
女
,
有
口
红
)
P
(
女
∣
有
口
红
)
。相信你看完下面这个推导会有所收获。
以下:
根据定义我们可以知道P(女|长头发, 有口红)就是同时具备“长头发, 有口红”这个特征的人中,具备“女,长头发, 有口红”这三个标签的人所占的比例。所以得到:
P ( 女 ∣ 长 头 发 , 有 口 红 ) = P ( 女 , 长 头 发 , 有 口 红 ) P ( 长 头 发 , 有 口 红 ) P(女|长头发, 有口红)=\frac{P(女,长头发, 有口红)}{P(长头发,有口红)}
P
(
女
∣
长
头
发
,
有
口
红
)
=
P
(
长
头
发
,
有
口
红
)
P
(
女
,
长
头
发
,
有
口
红
)
然后分子P(女,长头发, 有口红)这个联合概率可以变成一个条件概率公式。分母P(长头发,有口红)这也是联合概率
P ( 女 ∣ 长 头 发 , 有 口 红 ) = P ( 女 , 长 头 发 , 有 口 红 ) P ( 长 头 发 , 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 , 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P ( 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 ∣ 有 口 红 ) P ( 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P ( 有 口 红 ) = P ( 长 头 发 ∣ 女 , 有 口 红 ) P ( 女 ∣ 有 口 红 ) P ( 长 头 发 ∣ 有 口 红 ) P(女|长头发, 有口红)=\frac{P(女,长头发, 有口红)}{P(长头发,有口红)}=\frac{P(长头发|女, 有口红)P(女, 有口红)}{P(长头发|有口红)P(有口红)}=\frac{P(长头发|女, 有口红)P(女| 有口红)P(有口红)}{P(长头发|有口红)P(有口红)}=\frac{P(长头发|女, 有口红)P(女| 有口红)}{P(长头发|有口红)}
P
(
女
∣
长
头
发
,
有
口
红
)
=
P
(
长
头
发
,
有
口
红
)
P
(
女
,
长
头
发
,
有
口
红
)
=
P
(
长
头
发
∣
有
口
红
)
P
(
有
口
红
)
P
(
长
头
发
∣
女
,
有
口
红
)
P
(
女
,
有
口
红
)
=