概率、高斯和贝叶斯
csdn 2023-12-01
前言

上一章讨论了离散贝叶斯滤波器的一些缺点。对于许多跟踪和滤波问题,我们希望有一个单峰和连续的滤波器。例如,我们确定一架飞机的位置在 ( 12.34 , − 95.54 , 2389.5 ) (12.34, -95.54, 2389.5) (12.34,95.54,2389.5),三个数字分别表示纬度,经度和高度。我们不想让我们的滤波器告诉我们:它可能在 ( 1.65 , − 78.01 , 2100.45 ) (1.65, -78.01, 2100.45) (1.65,78.01,2100.45),它也可能在 ( 34.36 , − 98.23 , 2543.79 ) (34.36, -98.23, 2543.79) (34.36,98.23,2543.79)。这与我们的物理直觉不符。

我们希望用一种单峰的、连续的概率来模拟现实世界是如何工作的,并且在计算上是高效的。高斯分布提供了所有这些特征。


均值、方差和标准差

你们大多数人都应该接触过统计数据,但不管怎样,请允许我介绍一下。我要求你阅读这部分内容,即使你确定你很了解。主要有两个原因。首先,我想确定我们使用术语是相同的;第二,我努力让你形成对统计的直观理解。通过学习一门统计课程,只记住公式和计算方式是很容易的,但也许你对所学内容的含义是模糊的。

随机变量

每次掷骰子的结果都在1到6之间,如果我们把一个骰子掷600万次,我们得到1的次数是100万次。因此,我们说结果1的概率是 1 / 6 1/6 1/6。同样地,如果我问你下一次掷骰子的结果是1的概率,你会回答 1 / 6 1/6 1/6

这种值和对应概率的组合称为随机变量。这里的随机并不意味着过程是不确定的,只是我们缺乏关于结果的信息。掷骰子的结果是确定的,但我们缺乏足够的信息来推算出结果。我们不知道会发生什么,除了概率。

在随机变量的相关理论中,值的范围称为样本空间。对于骰子来说,样本空间是 { 1 , 2 , 3 , 4 , 5 , 6 } \{1, 2, 3, 4, 5, 6\} {1,2,3,4,5,6};对于硬币来说,样本空间是 { H , T } \{H, T\} {H,T}。空间是一个数学术语,意思是数的集合。骰子的样本空间,是自然数的子集(介于1到6之间的自然数)。

另一个随机变量的例子是一所大学里学生的身高,这里的样本空间是生物学定义的两个极限实数之间的范围。

随机变量,如硬币投掷和掷骰子是离散随机变量。这意味着它们的样本空间由有限个值表示的。人类的身高被称为连续随机变量,因为他们可以接受两个极限值之间的任何实际值。

不要混淆随机变量的观测值和实际值。如果我们对一个人身高的观测只能精确到 0.1 m 0.1m 0.1m,那么我们只能记录 0.1 , 0.2 , 0.3 , . . . , 2.7 0.1, 0.2, 0.3, ..., 2.7 0.1,0.2,0.3,...,2.7这些值,产生27个离散的结果。尽管如此,一个人的身高可以在这些范围内的任意实际值之间变化,因此身高是一个连续的随机变量。

在统计学中,大写字母用于表示随机变量,通常来自字母表的后半部分。所以,我们可以说 X X X是代表掷骰子结果的随机变量, Y Y Y是大一学生身高的随机变量。同时,如果我们需要使用到线性代数来解决某些问题,通常遵循的规则是:向量使用小写,矩阵使用大写。不幸的是,这些约定发生冲突,你必须从上下文中确定使用的是哪一个。我总是用粗体符号表示向量和矩阵,这有助于区分两者。

概率分布

概率分布给出了随机变量在样本空间中取任意值的概率。例如,对于一个骰子我们可以说:

Value Probability
1 1/6
2 1/6
3 1/6
4 1/6
5 1/6
6 1/6

我们用小写的 p p p表示这个分布: p ( x ) p(x) p(x)。我们可以写:

P ( X = 4 ) = p ( 4 ) = 1 6 P(X = 4) = p (4) = \frac{1}{6} P(X=4)=p(4)=61

这说明骰子的结果是4的概率是1/6。 P ( X = x k ) P(X = x_{k}) P(X=xk)表示随机变量 X X X x k x_{k} xk的概率,请注意细微的符号差异。大写 P P P表示单个事件的概率,小写 p p p表示概率分布函数。如果你不善于观察,这可能会使你误入歧途。一些文章使用 P r Pr Pr,而不是 P P P来改善这一点。

另一个例子是硬币,它的样本空间是 { H , T } \{H, T\} {H,T}。硬币是公平的,所以正面(H)的概率是50%,反面(T)的概率是50%。我们把它表示成:

{ P ( X = H ) = 0.5 P ( X = T ) = 0.5 \left\{\begin{matrix} P(X=H) = 0.5 \\ P(X=T) = 0.5 \end{matrix}\right. {P(X=H)=0.5P(X=T)=0.5

样本空间不是唯一的。骰子的一个样本空间是 { 1 , 2 , 3 , 4 , 5 , 6 } \{1, 2, 3, 4, 5, 6\} {1,2,3,4,5,6}。另一个有效的样本空间是 { \{ { , , , } \} }。一个样本空间,只要它涵盖了所有的可能性,并且任何单个事件只由一个元素描述,那么它就是有效的。 { \{ { , 1 , 3 , 4 , 5 } , 1, 3, 4, 5\} ,1,3,4,5}不是骰子的有效样本空间,因为值4与偶和4都匹配。

离散随机值的所有值的概率称为离散概率分布,连续随机值的所有值的概率称为连续概率分布

要成为概率分布,每个值 x i x_{i} xi的概率必须 p ( x i ) ≥ 0 p(x_{i}) \ge 0 p(xi)0,因为概率不能小于零。其次,所有值的概率之和必须等于1。这对于掷硬币来说应该是直观的:如果得到正面的几率是70%,那么得到反面的几率必须是30%。我们把这个要求公式化为:

对于离散分布:

∑ u P ( X = u ) = 1 \sum_ {u}^{} P(X = u) = 1 uP(X=u)=1

对于连续分布:

∫ u P ( X = u ) d u = 1 \int\limits_{u}^{} P(X=u)du = 1 uP(X=u)du=1

在上一章中,我们使用概率分布来估计狗在走廊中的位置:

import numpy as np import kf_book.book_plots as book_plots

belief = np.array([1, 4, 2, 0, 8, 2, 2, 35, 4, 3, 2]) belief = belief / np.sum(belief) with book_plots.figsize(y=2): book_plots.bar_plot(belief) print('sum = ', np.sum(belief)) 
sum =  1.0

在这里插入图片描述

每个位置的概率都是介于0和1之间,并且所有的概率之和等于1,所以这就是一个概率分布。每个概率都是离散的,所以我们可以更精确地称之为离散概率分布。在实践中,我们经常省略离散和连续这两个字眼,除非我们有特殊的理由作出这种区分。

随机变量的平均值、中位数和峰

给定一组数据,我们通常希望知道该组数据的代表值或均值。对此有很多衡量标准,这个概念被称为集中趋势量度。例如,我们可能想知道一个班级学生的平均身高。我们都知道如何求一组数据的均值,但让我来阐述一下这一点,以便介绍更正式的符号和术语。我们通过求和并除以值的个数来计算均值。如果学生的身高以 m m m为单位:

X = 1.8 , 2.0 , 1.7 , 1.9 , 1.6 X = 1.8,2.0,1.7,1.9,1.6 X=1.8,2.0,1.7,1.9,1.6

我们计算均值为:

μ = 1.8 + 2.0 + 1.7 + 1.9 + 1.6 5 = 1.8 \mu = \frac{1.8 + 2.0 +1.7 + 1.9 + 1.6}{5} = 1.8 μ=51.8+2.0+1.7+1.9+1.6=1.8

传统上,习惯用 μ \mu μ来表示均值。

我们可以把这个计算通用化:

μ = 1 n ∑ i = 1 n x i \mu = \frac{1}{n} \sum_{i = 1}^{n} x_{i} μ=n1i=1nxi

NumPy提供numpy.mean()用于计算均值:

x = [1.8, 2.0, 1.7, 1.9, 1.6] np.mean(x) 
1.8

为了方便起见,NumPy数组提供mean()方法:

x = np.array([1.8, 2.0, 1.7, 1.9, 1.6]) x.mean() 
1.8

一组数字的峰就是最常出现的数字。如果最常出现的数字只有1个,我们就说它是单峰;如果最常出现的数字2个及以上,我们就说它是多峰。例如,集合 { 1 , 2 , 2 , 3 , 4 , 4 } \{1, 2, 2, 3, 4, 4\} {1,2,2,3,4,4}具有2和4两个峰,这是多峰的;集合 { 5 , 7 , 7 , 13 } \{5, 7, 7, 13\} {5,7,7,13}具有7一个峰,因此它是单峰的。在本文中,我们不以这种方式计算峰,而是在更一般的意义上使用了单峰和多峰的概念。例如,我们给狗在不同位置都分配了概率,那么就认为狗的位置是多峰的。

最后,一组数字的中位数就是这组数字排序后的中点。因此,一半的值低于中位数,一半的值高于中位数。如果该组数字的个数是偶数,那么中位数就是这组数字排序后的两个中间数一起求平均值。

Numpy提供numpy.median()来计算中位数。如你所见, { 1.8 , 2.0 , 1.7 , 1.9 , 1.6 } \{1.8, 2.0, 1.7, 1.9, 1.6\} {1.8,2.0,1.7,1.9,1.6}的中位数是1.8,因为1.8是这个集合排序后的第三个元素。在这种情况下,中位数等于平均数,但通常这是不一定的。

np.median(x) 
1.8

随机变量的期望值

一个随机变量的期望值是它无穷样本下的均值。即我们取该随机变量的无穷多个样本,然后将这些样本平均在一起。假设 x = [ 1 , 3 , 5 ] x = [1, 3, 5] x=[1,3,5],且每个值的概率相等,那么 x x x的平均值是多少?

当然是 1 , 3 , 5 1, 3, 5 1,3,5的平均值,也就是3。这也是合情合理的:我们期望出现相等数量的1、3和5,所以 ( 1 + 3 + 5 ) / 3 = 3 (1 + 3 + 5) / 3 = 3 (1+3+5)/3=3显然是无限样本的均值。换句话说,这里的期望值是样本空间的均值。

现在假设每个值都有不同的发生概率。假设1有 80 % 80\% 80%的几率发生,3有 15 % 15\% 15%的几率,5只有 5 % 5\% 5%的几率。在这种情况下,我们通过 x x x的每个值乘以它发生的概率百分比来计算期望值,并对结果求和。对于这种情况,我们可以计算:

E [ X ] = ( 1 ) ( 0.8 ) + ( 3 ) ( 0.15 ) + ( 5 ) ( 0.05 ) = 1.5 \mathbb{E} [X]=(1)(0.8) + (3)(0.15) + (5)(0.05) = 1.5 E[X]=(1)(0.8)+(3)(0.15)+(5)(0.05)=1.5

这里我用符号 E [ X ] \mathbb{E} [X] E[X]表示 x x x的期望值,有些博文使用 E ( x ) E(x) E(x) x x x的期望值是1.5也是很直观的,因为 x x x相比较于3或5,更可能是1;相比较于5,更可能是3。

假设 x i x_{i} xi x x x的第 i t h i^{th} ith个值, p i p_{i} pi是它发生的概率,那么我们可以用以下公式来形式化期望:

E [ X ] = ∑ i = 1 n p i x i \mathbb{E}[X] = \sum_{i = 1}^{n}p_{i}x_{i} E[X]=i=1npixi

一点点代数知识表明,如果如果所有数出现的概率都相等,则期望值与平均值相同:

E [ X ] = ∑ i = 1 n p i x i = 1 n ∑ i = 1 n x i = μ x \mathbb{E}[X] = \sum_{i = 1}^{n}p_{i}x_{i} = \frac{1}{n} \sum_{i = 1}^{n}x_{i} = \mu _{x} E[X]=i=1npixi=n1i=1nxi=μx

如果 x x x是连续的,我们用积分来代替求和,就像这样:

E [ X ] = ∫ a b x f ( x ) d x \mathbb{E}[X] = \int_{a}^{b}xf(x)dx E[X]=abxf(x)dx

其中, f ( x ) f(x) f(x) x x x的概率分布函数。

我们可以编写一点Python来模拟这一点。这里我取1000000个样本,计算我们刚刚分析计算的分布的期望值:

total = 0 N = 1000000 for r in np.random.rand(N): if r <= .80: total += 1 elif r < .95: total += 3 else: total += 5 total / N
1.49924

你可以看到,计算出的值很接近分析求解出的值。这是因为计算出的值并不精确,如果想要获得精确的值需要无限的样本大小。

练习

骰子的期望值是多少?

解决方法

骰子每一面的概率都是相等的,所以每一面的概率都是 1 / 6 1/6 1/6。因此:

E [ X ] = 1 / 6 × 1 + 1 / 6 × 2 + 1 / 6 × 3 + 1 / 6 × 4 + 1 / 6 × 5 + 1 / 6 × 6 = 3.5 \mathbb{E}[X] = 1/6 \times 1 + 1/6 \times 2 + 1/6 \times 3 + 1/6 \times 4 + 1/6 \times 5 + 1/6 \times 6 = 3.5 E[X]=1/6×1+1/6×2+1/6×3+1/6×4+1/6×5+1/6×6=3.5

练习

给定均匀连续分布,计算 a = 0 a=0 a=0 b = 20 b=20 b=20的期望值:

f ( x ) = 1 b − a f(x) = \frac{1}{b-a} f(x)=ba1

解决方法

E [ X ] = ∫ 0 20 x 1 20 d x = [ x 2 40 ] 0 20 = 10 − 0 = 10 \mathbb{E}[X] = \int_{0}^{20}x\frac{1}{20}dx=\left [ \frac{x^{2}}{40} \right ] _{0}^{20} = 10-0 = 10 E[X]=020x201dx=[40x2]020=100=10


随机变量的方差

上面的计算告诉我们学生的平均身高,但它并不能告诉我们我们想知道的一切。例如,假设我们有三个班级的学生,我们给他们贴上 X X X Y Y Y Z Z Z的标签,身高数据如下:

X = [1.8, 2.0, 1.7, 1.9, 1.6] Y = [2.2, 1.5, 2.3, 1.7, 1.3] Z = [1.8, 1.8, 1.8, 1.8, 1.8] 

使用NumPy,我们看到每个班级的平均高度是相同的。

print(np.mean(X), np.mean(Y), np.mean(Z)) 
1.8 1.8 1.8

每个班级的平均高度都是 1.8 m 1.8m 1.8m,但请注意,第二个班级的身高变化比第一个班级大得多,而第三个班级的身高变化则完全没有。

均值告诉我们数据的部分信息,但不是全部,我们希望能够具体说明学生身高之间的差异有多大。你可以想象到有很多原因,也许一个学区需要订购5000张课桌,而且他们希望购买的课桌尺寸能适应学生的身高范围。

统计学把样本之间差异的概念形式化为标准差和方差。计算方差的公式是:

V A R ( X ) = E [ ( X − μ ) 2 ] VAR(X) = \mathbb{E} \left [ (X - \mu )^{2} \right ] VAR(X)=E[(Xμ)2]

暂时忽略平方,可以看到方差是样本空间 X X X与平均值 μ \mu μ的变化量的期望值: ( X − μ ) (X-\mu ) (Xμ),我稍后将解释平方项的用途。

期望值的公式是 E [ X ] = ∑ i = 1 n p i x i \mathbb{E}[X] = \sum _{i=1}^{n}p_{i}x_{i} E[X]=i=1npixi,因此我们可以将其代入上面的等式中得到:

V A R ( X ) = 1 n ∑ i = 1 n ( x i − μ ) 2 VAR(X) = \frac{1}{n} \sum _{i=1}^{n} (x_{i} - \mu )^{2} VAR(X)=n1i=1n(xiμ)2

让我们计算三个班级的方差,看看我们得到了什么值,并熟悉这个概念。

X X X的平均值是1.8( μ x = 1.8 \mu _{x} = 1.8 μx=1.8),所以我们得到:

V A R ( X ) = ( 1.8 − 1.8 ) 2 + ( 2 − 1.8 ) 2 + ( 1.7 − 1.8 ) 2 + ( 1.9 − 1.8 ) 2 + ( 1.6 − 1.8 ) 2 5 = 0.02 m 2 VAR(X) = \frac{(1.8-1.8)^{2} + (2-1.8)^{2} + (1.7-1.8)^{2} + (1.9-1.8)^{2} + (1.6-1.8)^{2}}{5} = 0.02m^{2} VAR(X)=5(1.81.8)2+(21.8)2+(1.71.8)2+(1.91.8)2+(1.61.8)2=0.02m2

NumPy提供函数var()来计算方差:

print("{:.2f} meters squared".format(np.var(X))) 
0.02 meters squared

这也许有点难以解释。高度以 m m m为单位,但方差是 m 2 m^{2} m2。因此,我们有一个更常用的度量,标准差,它被定义为方差的平方根:

σ = V A R ( X ) = 1 n ∑ i = 1 n ( x i − μ ) 2 \sigma = \sqrt[]{VAR(X)} = \sqrt[]{\frac{1}{n} \sum _{i=1}^{n} (x_{i} - \mu )^{2} } σ=VAR(X) =n1i=1n(xiμ)2

标准差通常表示为 σ \sigma σ,方差通常表示为 σ 2 \sigma ^{2} σ2

对于第一个班级,我们可以得到:

σ x = ( 1.8 − 1.8 ) 2 + ( 2 − 1.8 ) 2 + ( 1.7 − 1.8 ) 2 + ( 1.9 − 1.8 ) 2 + ( 1.6 − 1.8 ) 2 5 = 0.1414 m \sigma _{x} = \sqrt[]{\frac{(1.8-1.8)^{2} + (2-1.8)^{2} + (1.7-1.8)^{2} + (1.9-1.8)^{2} + (1.6-1.8)^{2}}{5}} = 0.1414m σx=5(1.81.8)2+(21.8)2+(1.71.8)2+(1.91.8)2+(1.61.8)2 =0.1414m

我们可以用NumPy的numpy.std()方法来计算标准差,std是标准差的常用缩写。

print('std {:.4f}'.format(np.std(X))) print('var {:.4f}'.format(np.std(X)**2)) 
std 0.1414
var 0.0200

标准差意味着什么?它告诉我们高度之间的差异有多少。在很多情况下, 68 % 68\% 68%的值都在均值的一个标准差之内。换言之,我们可以得出结论,对于随机一个班级班, 68 % 68\% 68%的学生身高在1.66( 1.8 − 0.1414 1.8 - 0.1414 1.80.1414)到1.94( 1.8 + 0.1414 1.8 + 0.1414 1.8+0.1414)之间。

我们可以在绘图中查看:

from kf_book.gaussian_internal import plot_height_std import matplotlib.pyplot as plt

plot_height_std(X) 

在这里插入图片描述

对于只有5个学生,我们显然不会在一个标准差内得到准确的 68 % 68\% 68%。从图像中可以看到,5个学生中有3个在 ± 1 σ \pm 1\sigma ±1σ范围内,即 60 % 60\% 60%。仅用5个样本就能达到的比例与 68 % 68\% 68%非常接近。让我们看一个有100名学生的班级的结果。

from numpy.random import randn
data = 1.8 + randn(100)*.1414 mean, std = data.mean(), data.std() plot_height_std(data, lw=2) print(f'mean = {mean:.3f}') print(f'std  = {std:.3f}') 
mean = 1.811
std  = 0.130

在这里插入图片描述

肉眼观察,大约 68 % 68\% 68%的高度在平均值1.8的 ± 1 σ \pm 1\sigma ±1σ范围内,但我们可以用代码验证这一点。

np.sum((data > mean-std) & (data < mean+std)) / len(data) * 100. 
69.0

我们很快会更深入地讨论这个问题。现在让我们来计算

Y = [ 2.2 , 1.5 , 2.3 , 1.7 , 1.3 ] Y = [2.2, 1.5, 2.3, 1.7, 1.3] Y=[2.2,1.5,2.3,1.7,1.3]

Y Y Y的平均值为 μ = 1.8 \mu = 1.8 μ=1.8,所以

σ y = ( 2.2 − 1.8 ) 2 + ( 1.5 − 1.8 ) 2 + ( 2.3 − 1.8 ) 2 + ( 1.7 − 1.8 ) 2 + ( 1.3 − 1.8 ) 2 5 = 0.39 m \sigma _{y} = \sqrt[]{\frac{(2.2-1.8)^{2} + (1.5-1.8)^{2} + (2.3-1.8)^{2} + (1.7-1.8)^{2} + (1.3-1.8)^{2}}{5}} = 0.39m σy=5(2.21.8)2+(1.51.8)2+(2.31.8)2+(1.71.8)2+(1.31.8)2 =0.39m

我们可以用NumPy确认:

print('std of Y is {:.2f} m'.format(np.std(Y))) 
std of Y is 0.39 m

这符合我们的预期。 Y Y Y的高度变化较大,标准差较大。

最后,让我们计算 Z Z Z的标准差。由于数值没有变化,所以我们希望标准偏差为零。

σ z = ( 1.8 − 1.8 ) 2 + ( 1.8 − 1.8 ) 2 + ( 1.8 − 1.8 ) 2 + ( 1.8 − 1.8 ) 2 + ( 1.8 − 1.8 ) 2 5 = 0 m \sigma _{z} = \sqrt[]{\frac{(1.8-1.8)^{2} + (1.8-1.8)^{2} + (1.8-1.8)^{2} + (1.8-1.8)^{2} + (1.8-1.8)^{2}}{5}} = 0m σz=5(1.81.8)2+(1.81.8)2+(1.81.8)2+(1.81.8)2+(1.81.8)2 =0m

print(np.std(Z)) 
0.0

在我们继续之前,需要指出的是,我忽略了一点:男人的平均身高比女人高。一般来说,一个只有男性或女性的班级的身高差异会小于一个男女都有的班级。其他因素也是如此:营养良好的孩子比营养不良的孩子高等。统计学家在设计实验时需要考虑这些因素。

我建议我们为学校订购课桌时,可以进行这种分析。对于每个年龄组,可能有两种不同的方法——一种聚集在女性的平均身高周围,另一种聚集在男性的平均身高周围,而整个班级的平均数将介于两者之间。如果我们按照所有学生的平均身高购买课桌,我们很可能会得到既不适合男生也不适合女生的课桌!

为什么是差异的平方

为什么计算方差,我们使用的是差异的平方?我可以用很多数学知识探讨,但让我们用一种简单的方式来看待这个问题。这是一张 X = [ 3 , − 3 , 3 , − 3 ] X = [3, −3, 3, −3] X=[3,3,3,3]值的图表:

X = [3, -3, 3, -3] mean = np.average(X) for i in range(len(X)): plt.plot([i ,i], [mean, X[i]], color='k') plt.axhline(mean) plt.xlim(-1, len(X)) plt.tick_params(axis='x', labelbottom=False) 

在这里插入图片描述

np.mean()和np.average()都是计算均值的函数,在不指定权重的时候average()和mean()是一样的。指定权重后,average可以计算加权均值。

如果我们不考虑差异的平方,这些符号会抵消一切:

( 3 − 0 ) + ( − 3 − 0 ) + ( 3 − 0 ) + ( − 3 − 0 ) 4 = 0 \frac{(3-0)+(-3-0)+(3-0)+(-3-0)}{4} = 0 4(30)+(30)+(30)+(30)=0

这显然是不正确的,因为数据中的方差大于0。

也许我们可以用绝对值?通过检查我们可以看出,结果是 12 / 4 = 3 12/4 = 3 12/4=3,这当然是正确的——每个值都与平均值相差3。但是如果我们有 Y = [ 6 , − 2 , − 3 , 1 ] Y=[6, −2, −3, 1] Y=[6,2,3,1],怎么办?在这种情况下,我们得到 12 / 4 = 3 12/4 = 3 12/4=3 Y Y Y显然比 X X X更分散,但计算得到的方差相同。如果我们使用平方的公式,我们得到 Y Y Y的方差为3.5,这反映了它更大的方差。

这不是正确的证明,事实上,这项技术的发明者Carl Friedrich Gauss认识到这有点武断。如果存在异常值,则平方差会给该项带来不成比例的权重。例如,让我们看看如果我们有:

X = [1, -1, 1, -2, -1, 2, 1, 2, -1, 1, -1, 2, 1, -2, 100] print(f'Variance of X with outlier    = {np.var(X):6.2f}') print(f'Variance of X without outlier = {np.var(X[:-1]):6.2f}') 
Variance of X with outlier    = 621.45
Variance of X without outlier =   2.03

你告诉我,这个对吗?如果没有异常值100,我们得到 σ 2 = 2.03 \sigma^{2} = 2.03 σ2=2.03,这准确地反映了在没有异常值的情况下 X X X是如何变化的。然而,一个异常值淹没了整个方差的计算。我们是想淹没计算,使我们知道有一个异常值;还是强有力地剔除异常值,但仍然提供一个剩下正常值的方差?显然,这取决于你要解决的问题。


高斯

我们现在准备学习高斯,让我们回顾下学习本文的动机。

我们希望用一种单峰的、连续的方式来表示概率,以模拟现实世界是如何工作的,并且希望它的计算是高效的。

让我们看一张高斯分布图,来了解一下我们在说什么。

from filterpy.stats import plot_gaussian_pdf

plot_gaussian_pdf(mean=1.8, variance=0.1414**2, xlabel='Student Height', ylabel='pdf') 

在这里插入图片描述

这个曲线是概率密度函数,简称pdf,它显示了随机变量取值的相对可能性。从图表中我们可以看出,学生身高接近 1.8 m 1.8m 1.8m的可能性比 1.7 m 1.7m 1.7m的可能性要大得多, 1.9 m 1.9m 1.9m的可能性比 1.4 m 1.4m 1.4m的可能性要大得多。换句话说,许多学生身高接近 1.8 m 1.8m 1.8m,只有极少数学生身高达到 1.4 m 1.4m 1.4m 2.2 m 2.2m 2.2m。最后请注意,曲线以均值 1.8 m 1.8m 1.8m左右对称。

高斯分布是普遍存在的,因为在现实世界中,许多观测值是以这种钟形曲线的方式存在的。因此,也有人会用钟形曲线来表示高斯分布。但我不会,因为还有许多的概率分布也具有相似的钟形曲线形状。

这条曲线并不是学生身高所独有的——大量的自然现象都表现出这种分布,包括我们用于滤波问题的传感器。正如我们将看到的,它具有我们正在寻找的所有属性——单峰、连续、计算效率高。而且,它还有其他我们可能没有意识到的良好性质。

回忆离散贝叶斯一文中概率分布的形状:

import kf_book.book_plots as book_plots

belief = [0., 0., 0., 0.1, 0.15, 0.5, 0.2, .15, 0, 0] book_plots.bar_plot(belief) 

在这里插入图片描述

它不是完美的高斯曲线,但它们是相似的。我们可以用高斯来代替那里使用的离散概率!

术语

在我们继续之前,先来点术语——下图描述了一个随机变量的值在 ( − ∞ , + ∞ ) (-\infty , +\infty ) (,+)之间的概率密度。这是什么意思?想象一下,我们在高速公路上对正在行驶的汽车的速度进行观测,那我们就可以将不同速度下的汽车的占比绘制出来。如果平均速度为 120 h m / h 120hm/h 120hm/h,则可能如下所示:

plot_gaussian_pdf(mean=120, variance=17**2, xlabel='speed(kph)') 

在这里插入图片描述

y y y轴描绘了概率密度——以对应 x x x轴上的速度行驶的车辆的对应值。

高斯模型也并不是完美的。虽然图表没有完全显示,但分布的尾部延伸到无穷远。尾部是曲线的远端,其值最低。当然,人的身高或汽车的速度不能小于零,更不用说 − ∞ -\infty + ∞ +\infty +。高斯分布模拟了实测车速的分布,但作为一个模型,它显然是不完美的。模型和现实之间的差异,将在滤波器中反复出现。高斯分布在数学的许多分支中都有应用,并不是因为它们完美地模拟了现实,而是因为它们比任何其他相对精确的选择都更易于计算和使用。

你会听到高斯分布,也被称为正态分布。高斯函数和正态函数在本文中的含义相同,可以互换使用,我希望你习惯于看到这两个。


高斯分布

让我们来探索高斯函数是如何工作的。高斯分布是一个连续的概率分布,它完全由两个参数描述,均值( μ \mu μ)和方差( σ 2 \sigma ^{2} σ2)。它定义为:

f ( x , μ , σ ) = 1 σ 2 π e x p [ − ( x − μ ) 2 2 σ 2 ] f(x, \mu ,\sigma ) = \frac{1}{\sigma \sqrt[]{2\pi } } exp[-\frac{(x-\mu )^{2}}{2\sigma ^{2}} ] f(x,μ,σ)=σ2π 1exp[2σ2(xμ)2]

其中, e x p [ x ] exp[x] exp[x] e x e^{x} ex的符号缩写。

如果你以前没见过这个方程式,就不要被它所劝阻,你不需要记忆它。此函数的计算存储在stats.py的gaussian(x, mean, var, normed=True)函数。

去掉常数,你可以看到它是一个简单的指数:

f ( x ) ∝ e − x 2 f(x) \propto e^{-x^{2}} f(x)ex2

它有我们熟悉的钟形曲线形状:

x = np.arange(-3, 3, .01) plt.plot(x, np.exp(-x**2)) 

在这里插入图片描述

让我们绘制一个平均值为22( μ = 22 \mu =22 μ=22)、方差为4( σ 2 = 4 \sigma ^{2}=4 σ2=4)的高斯曲线。

plot_gaussian_pdf(22, 4, mean_line=True, xlabel='$^{\circ}C$') 

在这里插入图片描述

这个曲线是什么意思?假设我们有一个读数为 22 ° C 22°C 22°C的温度计,没有一个温度计是完全准确的,因此我们的每个读数都会稍微偏离实际值。然而,中心极限定理指出,如果我们进行多次观测,观测值将是正态分布的。当我们看这个图表时,我们可以看到它与温度计在 22 ° C 22°C 22°C的实际温度下读取特定值的概率成正比。

回想一下高斯分布是连续的。想象一条无限长的直线——你随机选取的一个位于2的点的概率是多少。显然是 0 % 0\% 0%,因为有无数的选择可供选择。正态分布也是如此;在上图中,恰好为 22 ° C 22°C 22°C的概率为 0 % 0\% 0%,因为读数可以取无穷多的值。

这个曲线是什么?我们称之为概率密度函数。曲线下任意区域的面积给出概率。例如,如果你计算 20 ° C 20°C 20°C 22 ° C 22°C 22°C之间曲线下的面积,得到的面积就是温度读数在这两个温度之间的概率。

还有另一种理解它的方法。岩石或海绵的密度是多少?密度是一种度量给定空间大小的的质量的方法。岩石密度较大,海绵较小。所以,如果你想知道一块岩石有多重但没有直接观测出重量的仪器,你可以取它的体积乘以它的密度。实际上,大多数对象的密度都是不均匀的,因此可以将岩石体积的局部密度进行积分。

M = ∫ ∫ ∫ R p ( x , y , z ) d V M=\int \int \int_{R}^{} p(x, y, z) dV M=∫∫Rp(x,y,z)dV

我们对概率密度也是这样。如果你想知道温度在 20 ° C 20°C 20°C 21 ° C 21°C 21°C之间的可能性,你可以把上面的曲线从20到21积分。如你所知,曲线的积分给出了曲线下的面积。因为这是概率密度的曲线,所以密度的积分就是概率。

上面说到,一个点的概率是 0 % 0\% 0%。实际上,我们的传感器没有无限精度。因此, 22 ° C 22°C 22°C的读数意味着一个范围,例如 22 ± 0.1 ° C 22\pm 0.1°C 22±0.1°C,我们可以通过从 21.9 ° C 21.9°C 21.9°C 22.1 ° C 22.1°C 22.1°C的积分来计算该范围的概率。

你怎么计算概率,或者曲线下的面积?积分高斯函数的方程:

∫ x 0 x 1 1 σ 2 π e − ( x − μ ) 2 2 σ 2 d x \int_{x_{0}}^{x_{1}} \frac{1}{\sigma \sqrt[]{2\pi } } e^{-\frac{(x-\mu )^{2}}{2\sigma ^{2}} } dx x0x1σ2π 1e2σ2(xμ)2dx

这被称为累积概率分布,通常缩写为cdf。

filterpy.stats.norm_cdf为你计算了积分的结果。例如,我们可以计算:

from filterpy.stats import norm_cdf print('Cumulative probability of range 21.5 to 22.5 is {:.2f}%'.format( norm_cdf((21.5, 22.5), 22,4)*100)) print('Cumulative probability of range 23.5 to 24.5 is {:.2f}%'.format( norm_cdf((23.5, 24.5), 22,4)*100)) 
Cumulative probability of range 21.5 to 22.5 is 19.74%
Cumulative probability of range 23.5 to 24.5 is 12.10%

平均值( μ \mu μ)就是它听起来的样子——所有可能的均值。由于曲线的对称形状,它也是曲线最高部分的 x x x的取值。温度计的读数是 22 ° C 22°C 22°C,所以这就是我们计算的均值。

随机变量 X X X的正态分布的表示法是 X ∼ N ( μ , σ 2 ) X\sim N(\mu , \sigma ^{2}) XN(μ,σ2)。其中, ∼ \sim 表示服从的分布。这意味着我可以把温度计的温度读数表示为:

t e m p ∼ N ( 22 , 4 ) temp\sim N(22, 4) tempN(22,4)

这是一个极其重要的结果。高斯函数允许我用两个数,来捕捉无穷多的可能值!利用 μ = 22 \mu = 22 μ=22 σ 2 = 4 \sigma ^{2} = 4 σ2=4,我可以计算任何范围内的观测分布。

方差

因为这是一个概率密度分布,所以要求曲线下的面积总是等于1。这应该是直观清晰的——曲线下的区域代表所有可能的结果,发生了一些事情,而发生一些事情的概率是1,所以密度总和必须是1。我们可以用一些代码来证明这一点(如果你在数学上将高斯方程从 − ∞ -\infty 积分到 + ∞ +\infty +)。

print(norm_cdf((-1e8, 1e8), mu=0, var=4)) 
1.0

这就引出了一个重要的结论:如果方差很小,曲线就会很窄。这是因为方差是衡量样本与均值之间差异的一个指标。要使面积等于1,曲线也必须很高;另一方面,如果方差很大,曲线就会很宽,因此它也必须很低,使面积等于1

让我们从图形上看一下,我们可以通过filterpy.stats.gaussian()看看这个现象(采用单个值或值数组)。

from filterpy.stats import gaussian print(gaussian(x=3.0, mean=2.0, var=1)) print(gaussian(x=[3.0, 2.0], mean=2.0, var=1)) 
0.24197072451914337
[0.378 0.622]

默认情况下,高斯函数将输出标准化,从而将输出变回概率分布。使用参数normed来控制这个。

print(gaussian(x=[3.0, 2.0], mean=2.0, var=1, normed=False)) 
[0.242 0.399]

如果高斯分布不是标准化的,它被称为高斯函数而不是高斯分布

xs = np.arange(15, 30, 0.05) plt.plot(xs, gaussian(xs, 23, 0.2**2), label='$\sigma^2=0.2^2$') plt.plot(xs, gaussian(xs, 23, .5**2), label='$\sigma^2=0.5^2$', ls=':') plt.plot(xs, gaussian(xs, 23, 1**2), label='$\sigma^2=1^2$', ls='--') plt.legend() 

在这里插入图片描述

这告诉我们什么? σ 2 = 0. 2 2 \sigma ^{2} = 0.2^{2} σ2=0.22的高斯分布非常窄。这是说,我们非常相信 x = 23 x=23 x=23。相比之下, σ 2 = 1 2 \sigma ^{2} = 1^{2} σ2=12的高斯分布也相信 x = 23 x=23 x=23,但我们此时就不太确定了。我们认为 x = 23 x=23 x=23变低了,因此我们对 X X X可能值的看法是分散的——例如,我们认为 x = 20 x=20 x=20 x = 26 x=26 x=26也都是蛮有可能的。 σ 2 = 0. 2 2 \sigma ^{2} = 0.2^{2} σ2=0.22几乎完全消除了22或24作为可能值,而 σ 2 = 1 2 \sigma ^{2} = 1^{2} σ2=12认为它们几乎与23差不多,只略低一些。

如果我们回想一下温度计,我们可以认为这三条曲线代表了三个不同温度计的读数。 σ 2 = 0. 2 2 \sigma ^{2} = 0.2^{2} σ2=0.22的曲线表示非常准确的温度计, σ 2 = 1 2 \sigma ^{2} = 1^{2} σ2=12的曲线表示相当不准确的温度计。注意高斯分布给我们的非常强大的属性——我们可以完全用两个数字来表示温度计的读数和误差,即均值和方差。

高斯函数的等效形式是 N ( μ , 1 / τ ) N(\mu , 1/\tau) N(μ,1/τ),其中 μ \mu μ是平均值, τ \tau τ是精度 1 / τ = σ 2 1/\tau = \sigma ^{2} 1/τ=σ2,它是方差的倒数。虽然我们在本文中并没有使用这个公式,但它强调了方差是衡量我们的数据有多精确的一个指标。一个小的方差产生大的精度,表示我们的观测是非常精确的;相反,一个大的方差产生低精度:我们的观测可能没有那么精确了。你应该习惯于用这些等价形式来考虑高斯。

68-95-99.7规则

现在花点时间讨论标准差是值得的,标准差是衡量数据偏离均值的程度。对于高斯分布, 68 % 68\% 68%的数据落在均值的一个标准差( ± 1 σ \pm 1\sigma ±1σ)内, 95 % 95\% 95%落在两个标准差( ± 2 σ \pm 2\sigma ±2σ)内, 99.7 % 99.7\% 99.7%落在三个标准差( ± 3 σ \pm 3\sigma ±3σ)内。这通常被称为68-95-99.7规则。

如果你被告知一个班级的平均考试成绩是71分,标准差是9.4,你可以得出结论:如果分布是正态分布, 95 % 95\% 95%的学生得到的分数在52.2到89.8之间,即用 71 ± ( 2 × 9.4 ) 71\pm (2\times 9.4) 71±(2×9.4)计算。

最后,注意一下单位。如果我们位置的高斯分布是 μ = 22 m \mu = 22m μ=22m,那么标准差的单位也是 m m m。因此, σ = 0.2 \sigma = 0.2 σ=0.2意味着 68 % 68\% 68%的观测范围在 21.8 m 21.8m 21.8m 22.2 m 22.2m 22.2m之间。方差是标准差的平方,因此 σ 2 = 0.04 m 2 \sigma^{2} = 0.04m^{2} σ2=0.04m2。正如你在上文的一些表述中所看到的,写 σ 2 = 0. 2 2 \sigma^{2} = 0.2^{2} σ2=0.22很有意义,因为0.2与数据的单位相同。

下图描述了标准差和正态分布之间的关系。

from kf_book.gaussian_internal import display_stddev_plot

display_stddev_plot() 

在这里插入图片描述

交互动图

对于那些在Jupyter笔记本上读到这篇文章的人来说,这里是高斯的交互动图。使用滑块修改 μ \mu μ σ 2 \sigma ^{2} σ2。调整 μ \mu μ将使图形左右移动,而调整 σ 2 \sigma ^{2} σ2将使钟形曲线改变宽窄情况。

import math from ipywidgets import interact, FloatSlider def plt_g(mu,variance): plt.figure() xs = np.arange(2, 8, 0.01) ys = gaussian(xs, mu, variance) plt.plot(xs, ys) plt.ylim(0, 0.04) interact(plt_g, mu=FloatSlider(value=5, min=3, max=7), variance=FloatSlider(value = .03, min=.01, max=1.)) 

如果你没有本地运行环境,可以点击链接在线运行调试(加载的时间可能比较久):http://mybinder.org/repo/rlabbe/Kalman-and-Bayesian-Filters-in-Python

最后,如果你在网上阅读这篇文章,这里有一个高斯函数的动图。首先,均值右移。然后平均值以 μ = 5 \mu = 5 μ=5为中心,修改方差。

在这里插入图片描述


高斯函数的计算性质

离散贝叶斯滤波器的工作原理是将任意概率分布相乘和相加。卡尔曼滤波器使用高斯分布代替任意分布,但其余的算法几乎保持不变。这意味着我们将需要乘和加高斯。

高斯分布的一个显著特性是两个独立高斯的和是另一个高斯分布乘积不是高斯的,而是与高斯成比例的。在这里我们可以说两个高斯分布相乘的结果是一个高斯函数(在这种情况下,高斯函数而不是高斯分布,意味着不能保证概率密度值和为1的性质)。

在我们做数学推导之前,让我们直观地测试一下。

x = np.arange(-1, 3, 0.01) g1 = gaussian(x, mean=0.8, var=.1) g2 = gaussian(x, mean=1.3, var=.2) plt.plot(x, g1, x, g2) g = g1 * g2 # element-wise multiplication g = g / sum(g) # normalize plt.plot(x, g, ls='-.') 

在这里插入图片描述

在这里,我创建了两个高斯, g 1 = N ( 0.8 , 0.1 ) g1=N(0.8, 0.1) g1=N(0.8,0.1) g 2 = N ( 1.3 , 0.2 ) g2=N(1.3, 0.2) g2=N(1.3,0.2),并绘制了它们。然后我将它们相乘,并将结果归一化。如你所见,结果看起来像是高斯分布。

高斯函数是非线性函数。通常情况下,如果你把两个非线性方程相乘,你会得到一个不同类型的函数。例如,两个 s i n sin sin相乘的形状与 s i n ( x ) sin(x) sin(x)非常不同。

x = np.arange(0, 4*np.pi, 0.01) plt.plot(np.sin(1.2*x)) plt.plot(np.sin(1.2*x) * np.sin(2*x)) 

在这里插入图片描述

但是两个高斯分布相乘的结果是一个高斯函数。这是卡尔曼滤波器在计算上可行的一个关键原因。换句话说,卡尔曼滤波器使用高斯函数,因为它们在计算上表现很好。

两个独立高斯的乘积,由下式给出:

μ = σ 1 2 μ 2 + σ 2 2 μ 1 σ 1 2 + σ 2 2 \mu = \frac{\sigma _{1}^{2}\mu _{2} + \sigma _{2}^{2}\mu _{1}}{\sigma _{1}^{2} + \sigma _{2}^{2}} μ=σ12+σ22σ12μ2+σ22μ1

σ 2 = σ 1 2 σ 2 2 σ 1 2 + σ 2 2 \sigma ^{2} = \frac{\sigma _{1}^{2}\sigma _{2}^{2}}{\sigma _{1}^{2} + \sigma _{2}^{2}} σ2=σ12+σ22σ12σ22

两个独立高斯的和,由下式给出:

μ = μ 1 + μ 2 \mu = \mu _{1} + \mu _{2} μ=μ1+μ2

σ 2 = σ 1 2 + σ 2 2 \sigma ^{2} = \sigma _{1}^{2} + \sigma _{2}^{2} σ2=σ12+σ22

在本文的结尾,我推导了这些方程。然而,理解这个计算过程并不是很重要。


高斯联系滤波

现在我们讨论使用高斯如何用于滤波。在下一篇文章中,我们将使用高斯实现一个滤波器。这里我将解释为什么我们要使用高斯。

在上一章中,我们用数组表示概率分布。我们通过计算,该分布与另一个表示观测似然的分布相乘来执行更新计算,如下所示:

def normalize(p): return p / sum(p) def update(likelihood, prior): return normalize(likelihood * prior) prior = normalize(np.array([4, 2, 0, 7, 2, 12, 35, 20, 3, 2])) likelihood = normalize(np.array([3, 4, 1, 4, 2, 38, 20, 18, 1, 16])) posterior = update(likelihood, prior) book_plots.bar_plot(posterior) 

在这里插入图片描述

换句话说,我们必须计算10次乘法才能得到这个结果。对于具有多维大数组的真实滤波器,我们需要数十亿次乘法和大量内存。

但是这个分布看起来很像高斯分布。如果我们用高斯函数代替数组呢?我将计算后验值的均值和方差,并将其绘制在条形图上:

xs = np.arange(0, 10, .01) def mean_var(p): x = np.arange(len(p)) mean = np.sum(p * x,dtype=float) var = np.sum((x - mean)**2 * p) return mean, var

mean, var = mean_var(posterior) book_plots.bar_plot(posterior) plt.plot(xs, gaussian(xs, mean, var, normed=False), c='r') print('mean: %.2f' % mean, 'var: %.2f' % var) 
mean: 5.88 var: 1.24

在这里插入图片描述

这令人印象深刻。我们可以用两个数字来描述一个完整的分布。也许这个例子是没有说服力的,因为在分布中只有10个数字。但一个真正的问题可能有数百万个数字,但使用高斯仍然只需要两个数字来描述它。

回想一下我们的滤波器用的更新函数:

def update(likelihood, prior): return normalize(likelihood * prior) 

如果数组包含一百万个元素,那就是一百万次乘法。但是,如果我们用高斯函数代替数组,那么我们将用:

μ = σ 1 2 μ 2 + σ 2 2 μ 1 σ 1 2 + σ 2 2 \mu = \frac{\sigma _{1}^{2}\mu _{2} + \sigma _{2}^{2}\mu _{1}}{\sigma _{1}^{2} + \sigma _{2}^{2}} μ=σ12+σ22σ12μ2+σ22μ1

σ 2 = σ 1 2 σ 2 2 σ 1 2 + σ 2 2 \sigma ^{2} = \frac{\sigma _{1}^{2}\sigma _{2}^{2}}{\sigma _{1}^{2} + \sigma _{2}^{2}} σ2=σ12+σ22σ12σ22

整个流程只有三次乘法,二次除法。


贝叶斯理论

在上一篇文章中,我们通过推理我们在每一时刻所拥有的信息开发了一个算法,我们将其表示为离散概率分布。在这个过程中我们发现了贝叶斯定理。贝叶斯定理告诉我们,如何在给定先验的情况下计算事件发生的概率

我们使用以下概率公式来实现update()函数:

p o s t e r i o r = l i k e l i h o o d × p r i o r n o r m a l i z a t i o n posterior = \frac{likelihood \times prior}{normalization} posterior=normalizationlikelihood×prior

这实际上就是贝叶斯定理,但在许多方面,这掩盖了这个方程最简单的想法。我们将此解读为:

u p d a t e d k n o w l e d g e = ∣ l i k e l i h o o d o f n e w k n o w l e d g e × p r i o r k n o w l e d g e ∣ updated\ knowledge= \left | likelihood\ of\ new\ knowledge \times prior\ knowledge \right | updated knowledge=likelihood of new knowledge×prior knowledge

其中, ∣ ⋅ ∣ \left | \cdot \right | 表示归一化。

回顾一下,先验是在我们包含观测信息之前事情发生的概率,后验是我们在包含观测的信息之后事情发生的概率

贝叶斯定理是:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) P(A|B) = \frac{P(B|A)P(A)}{P(B)} P(AB)=P(B)P(BA)P(A)

P ( A ∣ B ) P(A|B) P(AB)称为条件概率。也就是说,它表示如果B发生的情况下,A发生的概率。例如,如果昨天下雨的话,今天下雨的可能性要比昨天是晴天的可能性大,因为降雨系统通常持续一天以上。考虑到昨天下雨,我们把今天下雨的概率写成 P ( P( P(今天下雨 ∣ | 昨天下雨 ) ) )

这忽略了一个重要的问题。在很多时候,我们使用的不是单一的概率,而是一组概率——概率分布。我刚才给贝叶斯方程使用的是概率,而不是概率分布。然而,它同样适用于概率分布。我们对概率分布使用小写的 p p p

p ( A ∣ B ) = p ( B ∣ A ) p ( A ) p ( B ) p(A|B) = \frac{p(B|A)p(A)}{p(B)} p(AB)=p(B)p(BA)p(A)

在上面的等式中, B B B是证据, P ( A ) P(A) P(A)是先验, P ( B ∣ A ) P(B|A) P(BA)是似然, P ( A ∣ B ) P(A|B) P(AB)是后验。根据公式,我们可以看出贝叶斯定理与update()函数的匹配度:我们将使用 x i x_{i} xi作为 i i i时刻的位置,观测值是 z z z。因此,我们想知道 P ( x i ∣ z ) P(x_{i}| z) P(xiz),也就是说,给定观测值 z z z,狗在 x i x_{i} xi的概率。

那么,让我们把它代入方程,然后求解它:

P ( x i ∣ z ) = P ( z ∣ x i ) P ( x i ) P ( z ) P(x_{i}| z) = \frac{P(z| x_{i})P(x_{i})}{P(z)} P(xiz)=P(z)P(zxi)P(xi)

这看起来有些难看,但实际上很简单。让我们找出右边每个词的意思:首先是 P ( z ∣ x i ) P(z| x_{i}) P(zxi),这是似然,也就是每个 x i x_{i} xi处观测值的准确性。 P ( x i ) P(x_{i}) P(xi)是先验——我们在包含观测值之前的概率。我们把它们相乘,这是update()函数中的非归一化乘法:

def update(likelihood, prior): posterior = prior * likelihood # p(z|x) * p(x) return normalize(posterior) 

最后要考虑的是分母 P ( z ) P(z) P(z)。这是在不考虑位置的情况下获得观测值 z z z的概率。代码上,我们通过计算sum(belief)。这是我们计算归一化的方法!所以,update()函数只不过是在计算贝叶斯定理而已。

文献中经常以积分的形式给出这些方程。毕竟,积分只是连续函数的和。所以,你可能会看到贝叶斯定理被写成:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) ∫ P ( B ∣ A j ) P ( A j ) d A j P(A|B) = \frac{P(B|A)P(A)}{\int P(B|A_{j})P(A_{j})dA_{j} } P(AB)=P(BAj)P(Aj)dAjP(BA)P(A)

这个分母通常是不可能用解析法求解的,就算它能被求解,在数学计算上也会非常困难。采用贝叶斯方法的滤波教科书中充满了积分方程,而积分往往没有解析解。但不要被这些方程吓倒,因为我们可以通过归一化后验概率来处理这个积分。在实践中,它只是一个归一化术语。

很可能你还没有完全明白贝叶斯定理的优点。我们要计算 p ( x i ∣ Z ) p(x_{i}|Z) p(xiZ),也就是说,在第 i i i步,给定一个观测值,计算我们的可能状态是什么。这是一个非常困难的问题,但又是很常见的。比如,根据癌症体检的结果,计算患癌症的概率;根据各种传感器的读数,计算下雨的概率等。

但是贝叶斯定理允许我们使用 p ( Z ∣ x i ) p(Z|x_{i}) p(Zxi)来计算这个,而这通常是很容易计算的:

p ( x i ∣ Z ) ∝ p ( Z ∣ x i ) p ( x i ) p(x_{i}|Z) \propto p(Z|x_{i})p(x_{i}) p(xiZ)p(Zxi)p(xi)

也就是说,为了计算给定特定传感器读数的下雨可能性,我们只需要计算给定下雨天气的传感器读数的可能性!这是一个容易得多的问题!好吧,天气预报仍然是一个难题,但是贝叶斯使它变得容易处理。


全概率定理

我们现在知道update()函数背后的数学原理,那么predict()函数呢?

predict()实现了全概率定理。让我们回忆一下update()的做法:它根据所有可能的运动事件来计算在任何给定位置的概率。假设在时间 t t t处于位置 i i i的概率可以写成 P ( X i t ) P(X_{i}^{t}) P(Xit)。那么,计算方式为: t − 1 t−1 t1时刻处于所有可能位置 j j j的先验值 p ( X t − 1 j ) p(X_{t−1}^{j}) p(Xt1j),乘以从对应 x j x_{j} xj移动到 x i {x_{i}} xi的概率,最后求和。即:

P ( X i t ) = ∑ j P ( X j t − 1 ) P ( x i ∣ x j ) P(X_{i}^{t}) = \sum_{j}^{} P(X_{j}^{t-1})P(x_{i}|x_{j}) P(Xit)=jP(Xjt1)P(xixj)

这个方程运用的就是全概率定理。引用维基百科:它表达了一个结果的总概率,这个结果可以通过几个不同的事件来实现。下面是计算这个等式的代码:

for i in range(N): for k in range (kN): index = (i + (width-k) - offset) % N
        result[i] += prob_dist[index] * kernel[k] 

scipy.stats计算概率

在本文中,我使用FilterPy的代码来计算和绘制高斯函数。我这样做是为了让你有机会看看代码,看看这些函数是如何实现的。然而,Python在FilterPy的代码中附带了大量scipy.stats模块里的统计函数。让我们来看看如何使用scipy.stats来进行计算。

这个scipy.stats模块包含许多对象,你可以使用这些对象来计算各种分布的属性。本模块的完整文档如下:http://docs.scipy.org/doc/scipy/reference/stats.html。我们将重点讨论正态分布的实现:我们可以使用scipy.stats.norm来计算高斯函数,并将其结果与FilterPy模块的Gaussian()函数的返回值进行比较。

from scipy.stats import norm import filterpy.stats print(norm(2, 3).pdf(1.5)) print(filterpy.stats.gaussian(x=1.5, mean=2, var=3*3)) 
0.13114657203397997
0.13114657203397995

调用normal(2, 3)会创建并返回一个均值为2、标准差为3的对象,然后可以多次使用此对象来获得各种值的概率密度,例如:

n23 = norm(2, 3) print('pdf of 1.5 is       %.4f' % n23.pdf(1.5)) print('pdf of 2.5 is also  %.4f' % n23.pdf(2.5)) print('pdf of 2 is         %.4f' % n23.pdf(2)) 
pdf of 1.5 is       0.1311
pdf of 2.5 is also  0.1311
pdf of 2 is         0.1330

scipy.stats.norm的文档列出许多其他函数。例如,我们可以使用rvs()函数从指定分布中生成 n n n个样本。

np.set_printoptions(precision=3, linewidth=50) print(n23.rvs(size=15)) 
[ 5.218  3.3    1.618  6.272 -0.711  6.019 -0.191
 -1.357  1.698 -3.283  5.745  0.691  0.15   0.506
  3.696]

我们也可以得到累积分布函数(cdf),它表示的是从分布中随机抽取的值小于或等于 x x x的概率。

# probability that a random value is less than the mean 2 print(n23.cdf(2)) 
0.5

当然,我们也可以得到分布的各种性质:

print('variance is', n23.var()) print('standard deviation is', n23.std()) print('mean is', n23.mean()) 
variance is 9.0
standard deviation is 3.0
mean is 2.0

用高斯函数模拟世界的局限性

前面我提到了中心极限定理,它指出:在某些条件下,任何独立随机变量的算术和都服从正态分布的,而无论该随机变量本身是如何分布的。这对我们来说很重要,因为自然界充满了非正太分布,但是当我们在大的总体上应用中心极限定理时,我们就得到了正态分布。

然而,中心极限定理的一个关键部分是在某些条件下。而这些条件通常不适用于物质世界,例如:厨房磅秤的读数不能低于零,但如果我们将观测误差表示为高斯,则曲线的左侧会延伸到负无穷远。这意味着也会给出负读数,尽管可能性非常小。

这是一个宽泛的话题,我不会详尽地讨论。

让我们考虑一个小例子。假设考试成绩服从正态分布,均值是90,标准差是13。因此,正态分布假设有人得到90分的可能性很大,有人得到40分的可能性很小。然而,这也意味着一个人获得-10或150分的可能性很小,同时也赋予了获得 − 1 0 300 -10^{300} 10300 1 0 32986 10^{32986} 1032986分的极小机会。高斯分布的尾部是无限长的。

但对于成绩的结果我们知道这不是真的。忽略额外的条件,一般情况下,分数不得少于0或超过100。让我们用正态分布来绘制这个值范围,看看它代表真实的考试分数分布:

xs = np.arange(10, 100, 0.05) ys = [gaussian(x, 90, 30) for x in xs] plt.plot(xs, ys, label='var=0.2') plt.xlim(0, 120) plt.ylim(-0.02, 0.09) 

在这里插入图片描述

这导致曲线下的面积不等于1,所以它不是概率分布。

同样,传感器观测中的误差很少是真正的高斯误差。现在谈论这给卡尔曼滤波器设计者带来的困难还为时过早。但值得记住的是,卡尔曼滤波器的数学模型是基于一个理想化的世界模型。现在,我将介绍一些代码,可能在后面的章节中会使用这些代码来形成分布,以模拟各种传感器。这种分布称为t分布。

假设我想模拟一个输出中有白噪声的传感器。为简单起见,假设信号为常数10,噪声的标准差为2。我们可以使用这个函数numpy.random.randn()得到一个均值为0,标准差为1的随机数。我可以用以下方法来模拟:

from numpy.random import randn def sense(): return 10 + randn()*2 

让我们画出这个信号,看看它是什么样子。

zs = [sense() for i in range(5000)] plt.plot(zs, lw=1) 

在这里插入图片描述

这看起来像是我所期望的。信号集中在10左右,标准差为2意味着 68 % 68\% 68%的观测值将在10的 ± 2 \pm 2 ±2范围内, 99 % 99\% 99%的观测值将在10的 ± 6 \pm 6 ±6范围内,这和图像中的样子很类似。

现在让我们看一下用t分布。我将不介绍数学知识,只给你源代码,然后用它绘制一个分布。

import random import math def rand_student_t(df, mu=0, std=1): """return random number distributed by Student's t 
    distribution with `df` degrees of freedom with the 
    specified mean and standard deviation.
    """ x = random.gauss(0, std) y = 2.0*random.gammavariate(0.5*df, 2.0) return x / (math.sqrt(y / df)) + mu
def sense_t(): return 10 + rand_student_t(7)*2 zs = [sense_t() for i in range(5000)] plt.plot(zs, lw=1) 

在这里插入图片描述

我们可以从图中看到,虽然输出类似于正态分布,但也有离群值远远超过均值的 3 σ 3\sigma 3σ(7到13)。

t分布也不太可能是传感器性能的精确模型,然而它确实能产生更合理的数据来测试滤波器在实际噪声中的性能。

这不是无谓的担忧。卡尔曼滤波方程假设噪声是正态分布的,如果不是这样,则执行效果就不怎么好了。一些关键任务上的滤波器(如航天器上的滤波器)的设计者需要掌握大量有关航天器上传感器性能的理论和经验知识。例如,我在美国宇航局的一次任务中看到的一个演示表明,虽然理论上他们应该使用3个标准差来区分噪声和实际观测值,但他们实际上使用的是5到6个标准差。这是他们通过实验确定的。

rand_student_t的代码包含在filterpy.stats文件中,你可以使用:

from filterpy.stats import rand_student_t

高斯积(可选)

这里我导出了两个高斯函数乘积的方程。

你可以通过将两个高斯方程相乘,再合并项找到这个结果,但是这样做的计算过程会变得很混乱。我将用贝叶斯定理导出它。我们可以把这个问题简化成:让先验概率服从 N ( μ ˉ , σ ˉ 2 ) N(\bar{\mu} , \bar{\sigma }^{2} ) N(μˉ,σˉ2),观测值 z ∝ N ( z , σ z 2 ) z \propto N(z, \sigma _{z}^{2} ) zN(z,σz2)。最终需要计算给定观测值 z z z后的后验概率是多少?

将后验概率写为 p ( x ∣ z ) p(x|z) p(xz)。现在我们可以用贝叶斯定理来说明:

p ( x ∣ z ) = p ( z ∣ x ) p ( x ) P ( z ) p(x|z) = \frac{p(z|x)p(x)}{P(z)} p(xz)=P(z)p(zx)p(x)

p ( z ) p(z) p(z)是归一化常数,所以我们可以简化为:

p ( x ∣ z ) ∝ p ( z ∣ x ) p ( x ) p(x|z) \propto p(z|x)p(x) p(xz)p(zx)p(x)

现在我们代入高斯方程:

p ( z ∣ x ) = 1 2 π σ z 2 e x p [ − ( z − x ) 2 2 σ z 2 ] p(z|x) = \frac{1}{\sqrt[]{2\pi \sigma _{z}^{2}} }exp[-\frac{(z-x)^{2}}{2\sigma _{z}^{2}} ] p(zx)=2πσz2 1exp[2σz2(zx)2]

p ( x ) = 1 2 π σ ˉ 2 e x p [ − ( x − μ ˉ ) 2 2 σ ˉ 2 ] p(x) = \frac{1}{\sqrt[]{2\pi \bar{\sigma }^{2}} }exp[-\frac{(x-\bar{ \mu} )^{2}}{2\bar{\sigma }^{2}} ] p(x)=2πσˉ2 1exp[2σˉ2(xμˉ)2]

我们可以去掉前导项,因为它们是常量:

p ( x ∣ z ) ∝ e x p [ − ( z − x ) 2 2 σ z 2 ] e x p [ − ( x − μ ˉ ) 2 2 σ ˉ 2 ] p(x|z) \propto exp[-\frac{(z-x)^{2}}{2\sigma _{z}^{2}} ]exp[-\frac{(x-\bar{ \mu} )^{2}}{2\bar{\sigma }^{2}} ] p(xz)exp[2σz2(zx)2]exp[2σˉ2(xμˉ)2]

∝ e x p [ − ( z − x ) 2 2 σ z 2 − ( x − μ ˉ ) 2 2 σ ˉ 2 ] \propto exp[-\frac{(z-x)^{2}}{2\sigma _{z}^{2}} -\frac{(x-\bar{ \mu} )^{2}}{2\bar{\sigma }^{2}}] exp[2σz2(zx)22σˉ2(xμˉ)2]

∝ e x p [ − 1 2 σ z 2 σ ˉ 2 [ σ ˉ 2 ( z − x ) 2 + σ z 2 ( x − μ ˉ ) 2 ] ] \propto exp[-\frac{1}{2\sigma _{z}^{2}\bar{ \sigma }^{2}} [\bar{ \sigma }^{2}(z-x)^{2} + \sigma _{z}^{2}(x - \bar{\mu } )^{2}]] exp[2σz2σˉ21[σˉ2(zx)2+σz2(xμˉ)2]]

现在我们乘出平方项,然后根据后验 x x x进行分组。

p ( x ∣ z ) ∝ e x p [ − 1 2 σ z 2 σ ˉ 2 [ σ ˉ 2 ( z 2 − 2 x z + x 2 ) + σ z 2 ( x 2 − 2 x μ ˉ + μ ˉ 2 ) ] ] p(x|z) \propto exp[-\frac{1}{2\sigma _{z}^{2}\bar{ \sigma }^{2}} [\bar{ \sigma }^{2}(z^{2} - 2xz + x^{2}) + \sigma _{z}^{2}(x^{2} - 2x\bar{\mu } +\bar{\mu }^{2} )]] p(xz)exp[2σz2σˉ21[σˉ2(z22xz+x2)+σz2(x22xμˉ+μˉ2)]]

∝ e x p [ − 1 2 σ z 2 σ ˉ 2 [ x 2 ( σ ˉ 2 + σ z 2 ) − 2 x ( σ z 2 μ ˉ + σ ˉ 2 z ) + ( σ ˉ 2 z 2 + σ z 2 μ ˉ 2 ) ] ] \propto exp[-\frac{1}{2\sigma _{z}^{2}\bar{ \sigma }^{2}} [x^{2}(\bar{\sigma }^{2} + \sigma _{z}^{2} ) - 2x(\sigma _{z}^{2}\bar{\mu } + \bar{\sigma }^{2}z) + (\bar {\sigma } ^{2}z^{2} + \sigma _{z}^{2}\bar{\mu }^{2} )]] exp[2σz2σˉ21[x2(σˉ2+σz2)2x(σz2μˉ+σˉ2z)+(σˉ2z2+σz2μˉ2)]]

最后一个括号不包含后面的 x x x,因此可以将其视为常量并丢弃。

p ( x ∣ z ) ∝ e x p [ − 1 2 σ z 2 σ ˉ 2 [ x 2 ( σ ˉ 2 + σ z 2 ) − 2 x ( σ z 2 μ ˉ + σ ˉ 2 z ) ] ] p(x|z) \propto exp[-\frac{1}{2\sigma _{z}^{2}\bar{ \sigma }^{2}} [x^{2}(\bar{\sigma }^{2} + \sigma _{z}^{2} ) - 2x(\sigma _{z}^{2}\bar{\mu } + \bar{\sigma }^{2}z) ]] p(xz)exp[2σz2σˉ21[x2(σˉ2+σz2)2x(σz2μˉ+σˉ2z)]]

将分子和分母除以 σ ˉ 2 + σ z 2 \bar {\sigma}^{2} + \sigma _{z}^{2} σˉ2+σz2得到:

p ( x ∣ z ) ∝ e x p [ − 1 2 x 2 − 2 x ( σ z 2 μ ˉ + σ ˉ 2 z ) σ ˉ 2 + σ z 2 σ z 2 σ ˉ 2 σ ˉ 2 + σ z 2 ] p(x|z) \propto exp[-\frac{1}{2} \frac{x^{2} - 2x(\frac{\sigma _{z}^{2}\bar{\mu } + \bar{\sigma }^{2}z) }{\bar {\sigma}^{2} + \sigma _{z}^{2}} }{\frac{\sigma _{z}^{2}\bar{ \sigma }^{2}}{\bar {\sigma}^{2} + \sigma _{z}^{2}} }] p(xz)exp[21σˉ2+σz2σz2σˉ2x22x(σˉ2+σz2σz2μˉ+σˉ2z)]

比例性允许我们随意创建或删除常量,因此我们可以将其考虑到:

p ( x ∣ z ) ∝ e x p [ − 1 2 ( x − σ z 2 μ ˉ + σ ˉ 2 z σ ˉ 2 + σ z 2 ) 2 σ z 2 σ ˉ 2 σ ˉ 2 + σ z 2 ] p(x|z) \propto exp[-\frac{1}{2} \frac{(x-\frac{\sigma _{z}^{2}\bar{\mu } + \bar{\sigma }^{2}z }{\bar {\sigma}^{2} + \sigma _{z}^{2}} )^{2}}{\frac{\sigma _{z}^{2}\bar{ \sigma }^{2}}{\bar {\sigma}^{2} + \sigma _{z}^{2}} }] p(xz)exp[21σˉ2+σz2σz2σˉ2(xσˉ2+σz2σz2μˉ+σˉ2z)2]

一个高斯函数类似于:

N ( μ , σ 2 ) ∝ e x p [ − 1 2 ( x − μ ) 2 σ 2 ] N(\mu , \sigma ^{2}) \propto exp[-\frac{1}{2}\frac{(x-\mu )^{2}}{\sigma ^{2}} ] N(μ,σ2)exp[21σ2(xμ)2]

所以我们可以看到 p ( x ∣ z ) p(x|z) p(xz)的均值为:

μ p o s t e r i o r = σ z 2 μ ˉ + μ ˉ 2 z σ ˉ 2 + σ z 2 \mu _{posterior} = \frac{\sigma _{z}^{2}\bar{\mu }+\bar{\mu }^{2}z }{\bar{\sigma }^{2} + \sigma _{z}^{2} } μposterior=σˉ2+σz2σz2μˉ+μˉ2z

方差为:

σ p o s t e r i o r 2 = σ z 2 σ ˉ 2 σ ˉ 2 + σ z 2 \sigma _{posterior}^{2} = \frac{\sigma _{z}^{2}\bar{\sigma }^{2} }{\bar{\sigma }^{2}+\sigma _{z}^{2} } σposterior2=σˉ2+σz2σz2σˉ2

我去掉了常数,所以结果不是正常的,而是成比例的。贝叶斯定理用 p ( z ) p(z) p(z)因子归一化,确保结果是归一化的。我们在滤波器的更新步骤中进行归一化,确保滤波器的估计是高斯的。

N 1 = ∣ N 2 ⋅ N 3 ∣ N_{1} = |N_{2}\cdot N_{3}| N1=N2N3


高斯和(可选)

这里我导出了两个高斯函数和的方程。

两个高斯的和由下式给出:

μ = μ 1 + μ 2 \mu = \mu_{1} + \mu_{2} μ=μ1+μ2

σ 2 = σ 1 2 + σ 2 2 \sigma ^{2} = \sigma_{1}^{2} + \sigma_{2}^{2} σ2=σ12+σ22

这有几个证据。我将使用卷积,因为我们在上一篇文章中使用卷积来表示概率的直方图。

为了求两个高斯随机变量之和的密度函数,我们先对每个变量的密度函数求和。它们是非线性的连续函数,所以我们需要用积分来计算和。如果随机变量 p p p z z z(如先验和观测)是独立的,我们可以用:

p ( x ) = ∫ − ∞ ∞ f p ( x − z ) f z ( z ) d x p(x) = \int_{-\infty }^{\infty } f_{p}(x-z)f_{z}(z)dx p(x)=fp(xz)fz(z)dx

这是一个卷积方程。现在我们来算一下:

p ( x ) = ∫ − ∞ + ∞ f 2 ( x − x 1 ) f 1 ( x 1 ) d x p(x) = \int _{-\infty}^{+\infty} f_2(x-x_1)f_1(x_1)dx p(x)=+f2(xx1)f1(x1)dx

= ∫ − ∞ + ∞ 1 2 π σ z exp ⁡ [ − ( x − z − μ z ) 2 2 σ z 2 ] 1 2 π σ p exp ⁡ [ − ( x − μ p ) 2 2 σ p 2 ] d x = \int_{-\infty}^{+\infty} \frac{1}{\sqrt{2\pi}\sigma_{z}}\exp\left[-\frac{(x - z - \mu_{z})^{2}}{2\sigma^{2}_{z}}\right] \frac{1}{\sqrt{2\pi}\sigma_{p}}\exp\left[-\frac{(x - \mu_{p})^{2}}{2\sigma^{2}_{p}}\right] dx =+2π σz1exp[2σz2(xzμz)2]2π σp1exp[2σp2(xμp)2]dx

= ∫ − ∞ + ∞ 1 2 π σ p 2 + σ z 2 exp ⁡ [ − ( x − ( μ p + μ z ) ) ) 2 2 ( σ z 2 + σ p 2 ) ] 1 2 π σ p σ z σ p 2 + σ z 2 exp ⁡ [ − ( x − σ p 2 ( x − μ z ) + σ z 2 μ p ) ) 2 2 ( σ p σ x σ z 2 + σ p 2 ) 2 ] d x = \int_{-\infty}^{+\infty} \frac{1}{\sqrt{2\pi}\sqrt{\sigma_{p}^{2} + \sigma_{z}^{2}}} \exp\left[ -\frac{(x - (\mu_{p} + \mu_{z})))^{2}}{2(\sigma_{z}^{2}+\sigma_{p}^{2})}\right] \frac{1}{\sqrt{2\pi}\frac{\sigma_{p}\sigma_{z}}{\sqrt{\sigma_{p}^{2} + \sigma_{z}^{2}}}} \exp\left[ -\frac{(x - \frac{\sigma_{p}^{2}(x-\mu_{z}) + \sigma_{z}^{2}\mu_{p}}{}))^{2}}{2\left(\frac{\sigma_{p}\sigma_{x}}{\sqrt{\sigma_{z}^{2}+\sigma_{p}^{2}}}\right)^{2}}\right]dx =+2π σp2+σz2 1exp[2(σz2+σp2)(x(μp+μz)))2]2π σp2+σz2 σpσz1exp 2(σz2+σp2 σpσx)2(xσp2(xμz)+σz2μp))2 dx

= 1 2 π σ p 2 + σ z 2 exp ⁡ [ − ( x − ( μ p + μ z ) ) ) 2 2 ( σ z 2 + σ p 2 ) ] ∫ − ∞ + ∞ 1 2 π σ p σ z σ p 2 + σ z 2 exp ⁡ [ − ( x − σ p 2 ( x − μ z ) + σ z 2 μ p ) ) 2 2 ( σ p σ x σ z 2 + σ p 2 ) 2 ] d x = \frac{1}{\sqrt{2\pi}\sqrt{\sigma_{p}^{2} + \sigma_{z}^{2}}} \exp\left[ -\frac{(x - (\mu_{p} + \mu_{z})))^{2}}{2(\sigma_{z}^{2}+\sigma_{p}^{2})}\right] \int_{-\infty}^{+\infty} \frac{1}{\sqrt{2\pi}\frac{\sigma_{p}\sigma_{z}}{\sqrt{\sigma_{p}^{2} + \sigma_{z}^{2}}}} \exp\left[ -\frac{(x - \frac{\sigma_{p}^{2}(x-\mu_{z}) + \sigma_{z}^{2}\mu_{p}}{}))^{2}}{2\left(\frac{\sigma_{p}\sigma_{x}}{\sqrt{\sigma_{z}^{2}+\sigma_{p}^{2}}}\right)^{2}}\right]dx =2π σp2+σz2 1exp[2(σz2+σp2)(x(μp+μz)))2]+2π σp2+σz2 σpσz1exp 2(σz2+σp2 σpσx)2(xσp2(xμz)+σz2μp))2 dx

积分中的表达式是正态分布。正态分布的和是1,因此积分是1。这给了我们:

p ( x ) = 1 2 π σ p 2 + σ z 2 exp ⁡ [ − ( x − ( μ p + μ z ) ) ) 2 2 ( σ z 2 + σ p 2 ) ] p(x) = \frac{1}{\sqrt{2\pi}\sqrt{\sigma_{p}^{2} + \sigma_{z}^{2}}} \exp\left[ -\frac{(x - (\mu_{p} + \mu_{z})))^{2}}{2(\sigma_{z}^{2}+\sigma_{p}^{2})}\right] p(x)=2π σp2+σz2 1exp[2(σz2+σp2)(x(μp+μz)))2]

这是一个高斯分布的正常形式,其中:

μ x = μ p + μ z \mu_{x} = \mu_{p} + \mu_{z} μx=μp+μz

σ x 2 = σ p 2 + σ z 2 \sigma_{x}^{2} = \sigma_{p}^{2} + \sigma_{z}^{2} σx2=σp2+σz2


总结和要点

本文对统计学的总体介绍很少,我只讨论了需要使用的高斯函数的概念,其他很少赘述。在我们继续之前,你必须了解以下几点:

  • 高斯分布表示一个连续的概率分布;
  • 它们完全由两个参数来描述:均值( μ \mu μ)和方差( σ 2 \sigma^{2} σ2);
  • μ \mu μ是所有可能值的均值;
  • 方差 σ 2 \sigma^{2} σ2表示我们的观测值与均值的差异;
  • 标准差( σ \sigma σ)是方差( σ 2 \sigma^{2} σ2)的平方根;
  • 自然界中许多事物近似于正态分布,但并不完美;
  • 在滤波问题中,计算 p ( x ∣ z ) p(x|z) p(xz)几乎是不可能的,但是计算 p ( z ∣ x ) p(z|x) p(zx)是简单的。贝叶斯定理让我们从后者计算前者。
声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • C语言
  • 编程
  • 软件开发
  • 程序
下载排行榜
更多
评测报告
更多
广告