DeepSORT(目标跟踪算法)中卡尔曼滤波器中的更新
flyfish
说协方差先说期望
在协方差的定义中,符号 E \mathbb{E} E 表示期望值(Expectation)。期望值是随机变量的平均值或均值,表示在大量试验中随机变量的平均结果。
期望值的详细解释
期望值 E [ X ] \mathbb{E}[X] E[X] 是指随机变量 X X X 在概率意义上的平均值。它可以看作是随机变量在无限次重复试验中的平均值。
离散型随机变量的期望值
对于离散型随机变量 X X X 取值 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn,并且对应的概率为 p 1 , p 2 , … , p n p_1, p_2, \ldots, p_n p1,p2,…,pn,其期望值定义为:
E [ X ] = ∑ i = 1 n x i ⋅ p i \mathbb{E}[X] = \sum_{i=1}^{n} x_i \cdot p_i E[X]=∑i=1nxi⋅pi
即每个取值 x i x_i xi 乘以其对应的概率 p i p_i pi,然后将这些乘积求和。
连续型随机变量的期望值
对于连续型随机变量 X X X 具有概率密度函数 f ( x ) f(x) f(x),其期望值定义为:
E [ X ] = ∫ − ∞ ∞ x ⋅ f ( x ) d x \mathbb{E}[X] = \int_{-\infty}^{\infty} x \cdot f(x) \, dx E[X]=∫−∞∞x⋅f(x)dx
即对 x x x 和其概率密度函数 f ( x ) f(x) f(x) 的乘积进行积分。
在协方差定义中的期望值
在协方差的定义中,期望值 E \mathbb{E} E 用于计算随机变量的均值,以及偏离均值的乘积的均值:
Cov ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] \text{Cov}(X, Y) = \mathbb{E}[(X - \mathbb{E}[X])(Y - \mathbb{E}[Y])] Cov(X,Y)=E[(X−E[X])(Y−E[Y])]
具体步骤如下:
- 计算均值(期望值):
- 计算 X X X 的均值: E [ X ] \mathbb{E}[X] E[X]
- 计算 Y Y Y 的均值: E [ Y ] \mathbb{E}[Y] E[Y]
- 中心化变量:
- 对 X X X 做中心化: X − E [ X ] X - \mathbb{E}[X] X−E[X]
- 对 Y Y Y 做中心化: Y − E [ Y ] Y - \mathbb{E}[Y] Y−E[Y]
- 计算中心化变量的乘积的期望值:
- 计算 ( X − E [ X ] ) ( Y − E [ Y ] ) (X - \mathbb{E}[X])(Y - \mathbb{E}[Y]) (X−E[X])(Y−E[Y]) 的期望值,即平均值。
这样得到的结果就是 X X X 和 Y Y Y 的协方差,表示它们的共同变化程度。
举例说明期望值
假设我们有一个离散型随机变量 X X X,其取值和概率如下:
X X X | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
P ( X ) P(X) P(X) | 0.1 | 0.2 | 0.3 | 0.2 | 0.2 |
其期望值 E [ X ] \mathbb{E}[X] E[X] 计算如下:
E [ X ] = 1 ⋅ 0.1 + 2 ⋅ 0.2 + 3 ⋅ 0.3 + 4 ⋅ 0.2 + 5 ⋅ 0.2 = 0.1 + 0.4 + 0.9 + 0.8 + 1 = 3.2 \mathbb{E}[X] = 1 \cdot 0.1 + 2 \cdot 0.2 + 3 \cdot 0.3 + 4 \cdot 0.2 + 5 \cdot 0.2 = 0.1 + 0.4 + 0.9 + 0.8 + 1 = 3.2 E[X]=1⋅0.1+2⋅0.2+3⋅0.3+4⋅0.2+5⋅0.2=0.1+0.4+0.9+0.8+1=3.2
这表示,如果我们重复进行很多次试验,随机变量 X X X 的平均值会趋近于 3.2。
协方差的定义
协方差是统计学中用于度量两个随机变量共同变化程度的指标。给定两个随机变量 X X X 和 Y Y Y,它们的协方差定义如下:
Cov ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] \text{Cov}(X, Y) = \mathbb{E}[(X - \mathbb{E}[X])(Y - \mathbb{E}[Y])] Cov(X,Y)=E[(X−E[X])(Y−E[Y])]
让我们逐步解释这个公式:
- 期望值 ( E \mathbb{E} E):
- 期望值是随机变量的平均值或均值,表示在大量试验中随机变量的平均结果。
- E [ X ] \mathbb{E}[X] E[X] 表示 X X X 的期望值(均值), E [ Y ] \mathbb{E}[Y] E[Y] 表示 Y Y Y 的期望值。
- 中心化:
- X − E [ X ] X - \mathbb{E}[X] X−E[X] 表示 X X X 偏离其均值的程度,称为 X X X 的中心化。
- Y − E [ Y ] Y - \mathbb{E}[Y] Y−E[Y] 表示 Y Y Y 偏离其均值的程度,称为 Y Y Y 的中心化。
- 乘积:
- ( X − E [ X ] ) ( Y − E [ Y ] ) (X - \mathbb{E}[X])(Y - \mathbb{E}[Y]) (X−E[X])(Y−E[Y]) 表示 X X X 和 Y Y Y 各自偏离均值的乘积。
- 期望值:
- E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] \mathbb{E}[(X - \mathbb{E}[X])(Y - \mathbb{E}[Y])] E[(X−E[X])(Y−E[Y])] 表示这些偏离乘积的平均值,这就是协方差。
协方差的含义
协方差度量了两个变量如何一起变化:
- 正协方差:如果协方差是正的,表示当 X X X 增大时 Y Y Y 也倾向于增大,反之亦然。这意味着 X X X 和 Y Y Y 之间有正相关关系。
- 负协方差:如果协方差是负的,表示当 X X X 增大时 Y Y Y 倾向于减小,反之亦然。这意味着 X X X 和 Y Y Y 之间有负相关关系。
- 零协方差:如果协方差是零,表示 X X X 和 Y Y Y 之间没有线性关系。
简单例子
假设我们有两个变量 X X X 和 Y Y Y,并且有几组观测值:
X X X | Y Y Y |
---|---|
1 | 2 |
2 | 3 |
3 | 6 |
4 | 8 |
5 | 10 |
- 计算均值:
- E [ X ] = 1 + 2 + 3 + 4 + 5 5 = 3 \mathbb{E}[X] = \frac{1+2+3+4+5}{5} = 3 E[X]=51+2+3+4+5=3
- E [ Y ] = 2 + 3 + 6 + 8 + 10 5 = 5.8 \mathbb{E}[Y] = \frac{2+3+6+8+10}{5} = 5.8 E[Y]=52+3+6+8+10=5.8
- 中心化并计算偏离乘积:
- 对于每个观测值,计算 ( X − E [ X ] ) ( Y − E [ Y ] ) (X - \mathbb{E}[X])(Y - \mathbb{E}[Y]) (X−E[X])(Y−E[Y]):
- 第一组: ( 1 − 3 ) ( 2 − 5.8 ) = 2 × 3.8 = 7.6 (1-3)(2-5.8) = 2 \times 3.8 = 7.6 (1−3)(2−5.8)=2×3.8=7.6
- 第二组: ( 2 − 3 ) ( 3 − 5.8 ) = 1 × 2.8 = 2.8 (2-3)(3-5.8) = 1 \times 2.8 = 2.8 (2−3)(3−5.8)=1×2.8=2.8
- 第三组: ( 3 − 3 ) ( 6 − 5.8 ) = 0 × 0.2 = 0 (3-3)(6-5.8) = 0 \times 0.2 = 0 (3−3)(6−5.8)=0×0.2=0
- 第四组: ( 4 − 3 ) ( 8 − 5.8 ) = 1 × 2.2 = 2.2 (4-3)(8-5.8) = 1 \times 2.2 = 2.2 (4−3)(8−5.8)=1×2.2=2.2
- 第五组: ( 5 − 3 ) ( 10 − 5.8 ) = 2 × 4.2 = 8.4 (5-3)(10-5.8) = 2 \times 4.2 = 8.4 (5−3)(10−5.8)=2×4.2=8.4
- 计算协方差:
- 取这些乘积的平均值:
Cov ( X , Y ) = 7.6 + 2.8 + 0 + 2.2 + 8.4 5 = 21 5 = 4.2 \text{Cov}(X, Y) = \frac{7.6 + 2.8 + 0 + 2.2 + 8.4}{5} = \frac{21}{5} = 4.2 Cov(X,Y)=57.6+2.8+0+2.2+8.4=521=4.2
综述
协方差通过衡量两个变量共同偏离均值的方式来表示它们之间的关系。正协方差表示正相关,负协方差表示负相关,零协方差表示没有线性关系。通过理解这些,可以更好地理解数据中不同变量之间的关系。
# 定义随机变量和对应的概率
X_values = [1, 2, 3, 4, 5]
P_X = [0.1, 0.2, 0.3, 0.2, 0.2]# 计算期望值
expected_value = sum(x * p for x, p in zip(X_values, P_X))
print("期望值 (均值) =", expected_value)
期望值 (均值) = 3.2
代码展示
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt# 生成随机数据
np.random.seed(42)
data = np.random.randn(100, 5) # 生成100个样本,每个样本有5个特征
columns = ['Feature1', 'Feature2', 'Feature3', 'Feature4', 'Feature5']
df = pd.DataFrame(data, columns=columns)# 计算协方差矩阵
cov_matrix = df.cov()# 使用热图可视化协方差矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(cov_matrix, annot=True, fmt='.2f', cmap='coolwarm', square=True, cbar_kws={"shrink": .8})
plt.title('Covariance Matrix Heatmap')
plt.show()
通过热图等可视化方法,可以直观地观察协方差矩阵,理解各变量间的相关性及其不确定性。
卡尔曼滤波器主要通过两个噪声协方差矩阵来表示系统中的不确定性:
过程噪声协方差矩阵( Q Q Q)和测量噪声协方差矩阵( R R R)。
1. 过程噪声协方差矩阵( Q Q Q)
过程噪声协方差矩阵 Q Q Q 表示系统模型中的不确定性。具体来说:
- 过程噪声:过程噪声(也称为模型噪声或系统噪声)是指系统的状态在每一步更新时所包含的随机误差。这种噪声可能来源于系统建模的不完善、外界扰动或者其他不可预测的变化。
- 协方差矩阵 Q Q Q:矩阵 Q Q Q 的每个元素表示系统不同状态变量之间噪声的协方差。对角线元素表示各个状态变量自身的不确定性,非对角线元素表示不同状态变量之间的相关性。
2. 测量噪声协方差矩阵( R R R)
测量噪声协方差矩阵 R R R 表示传感器测量中的不确定性。具体来说:
- 测量噪声:测量噪声是指传感器在获取系统状态测量值时所包含的随机误差。它可能来源于传感器的精度限制、外部环境的干扰等。
- 协方差矩阵 R R R:矩阵 R R R 的每个元素表示不同测量值之间噪声的协方差。对角线元素表示各个测量值自身的不确定性,非对角线元素表示不同测量值之间的相关性。
3. 不确定性的表达
通过 Q Q Q 和 R R R 矩阵,卡尔曼滤波器在以下方面表达和处理不确定性:
- 状态预测:在预测步骤中,卡尔曼滤波器使用过程噪声协方差矩阵 Q Q Q 来估计由于过程噪声引入的不确定性,从而更新预测状态的协方差。
- 测量更新:在更新步骤中,卡尔曼滤波器使用测量噪声协方差矩阵 R R R 来衡量测量噪声的不确定性,从而更新状态估计和协方差矩阵。
卡尔曼增益 K K K 的计算公式中确实包含了过程噪声协方差矩阵 Q Q Q 和测量噪声协方差矩阵 R R R
卡尔曼增益 K K K 的计算公式
卡尔曼增益 K K K 是在更新步骤中计算的,公式如下:
K = P k − H k T ( H k P k − H k T + R ) − 1 K = P_k^- H_k^T (H_k P_k^- H_k^T + R)^{-1} K=Pk−HkT(HkPk−HkT+R)−1
其中:
- P k − P_k^- Pk− 是预测误差协方差矩阵。
- H k H_k Hk 是观测矩阵。
- R R R 是测量噪声协方差矩阵。
过程噪声协方差矩阵 Q Q Q 和测量噪声协方差矩阵 R R R
这两个矩阵在卡尔曼滤波器的预测和更新步骤中起到关键作用:
- 预测步骤:(DeepSORT(目标跟踪算法)中卡尔曼滤波器中的预测)
- 状态预测:
x ^ k − = A x ^ k − 1 + B u k − 1 \hat{x}_k^- = A \hat{x}_{k-1} + B u_{k-1} x^k−=Ax^k−1+Buk−1 - 误差协方差预测:
P k − = A P k − 1 A T + Q P_k^- = A P_{k-1} A^T + Q Pk−=APk−1AT+Q在这里,过程噪声协方差矩阵 Q Q Q 用于更新预测误差协方差矩阵 P k − P_k^- Pk−。它反映了系统内部的随机变化或不确定性。
- 更新步骤:
- 计算卡尔曼增益:
K k = P k − H k T ( H k P k − H k T + R ) − 1 K_k = P_k^- H_k^T (H_k P_k^- H_k^T + R)^{-1} Kk=Pk−HkT(HkPk−HkT+R)−1 - 状态更新:
x ^ k = x ^ k − + K k ( z k − H k x ^ k − ) \hat{x}_k = \hat{x}_k^- + K_k (z_k - H_k \hat{x}_k^-) x^k=x^k−+Kk(zk−Hkx^k−) - 误差协方差更新:
P k = ( I − K k H k ) P k − P_k = (I - K_k H_k) P_k^- Pk=(I−KkHk)Pk−在这里,测量噪声协方差矩阵 R R R 直接出现在卡尔曼增益的计算公式中。它反映了观测数据中的噪声和不确定性。
从卡尔曼增益的计算公式中,我们可以看出:
-
预测误差协方差矩阵 P k − P_k^- Pk− 包含了过程噪声协方差矩阵 Q Q Q,因为 P k − P_k^- Pk− 是通过前一个时间步的误差协方差矩阵 P k − 1 P_{k-1} Pk−1 和过程噪声协方差矩阵 Q Q Q 进行更新的。具体地, P k − = A P k − 1 A T + Q P_k^- = A P_{k-1} A^T + Q Pk−=APk−1AT+Q。
-
测量噪声协方差矩阵 R R R 直接出现在卡尔曼增益的分母部分(即 H k P k − H k T + R H_k P_k^- H_k^T + R HkPk−HkT+R 中),影响了卡尔曼增益的大小。
-
过程噪声协方差矩阵 Q Q Q 影响预测误差协方差矩阵 P k − P_k^- Pk−,从而间接影响卡尔曼增益 K K K。
-
测量噪声协方差矩阵 R R R 直接出现在卡尔曼增益的计算公式中,影响了卡尔曼增益 K K K 的值。
卡尔曼增益 K K K 的计算公式通过组合预测误差协方差矩阵 P k − P_k^- Pk− 和测量噪声协方差矩阵 R R R 来确定当前测量和预测在更新状态估计时的权重,从而实现对系统状态的最优估计。
状态估计
状态估计是指系统的当前状态向量的估计值。这通常是一个包含系统所有状态变量的向量。比如,假设我们在跟踪一个运动物体的状态,其状态向量可能包含位置和速度:
x ^ k = [ position x position y velocity x velocity y ] \hat{x}_k = \begin{bmatrix} \text{position}_x \\ \text{position}_y \\ \text{velocity}_x \\ \text{velocity}_y \end{bmatrix} x^k= positionxpositionyvelocityxvelocityy
在卡尔曼滤波器中,状态估计分为预测估计和更新估计:
- 预测状态估计:通过系统动态模型从先前的状态估计得到当前时间步的预测状态。
x ^ k − = A x ^ k − 1 + B u k − 1 \hat{x}_k^- = A \hat{x}_{k-1} + B u_{k-1} x^k−=Ax^k−1+Buk−1 - 更新状态估计:结合预测估计和当前的测量值来更新状态估计。
x ^ k = x ^ k − + K k ( z k − H k x ^ k − ) \hat{x}_k = \hat{x}_k^- + K_k (z_k - H_k \hat{x}_k^-) x^k=x^k−+Kk(zk−Hkx^k−)
误差协方差矩阵
协方差矩阵用于描述状态估计的不确定性,它表示状态估计中的误差分布情况。误差协方差矩阵的对角元素表示各个状态变量估计的方差,非对角元素表示状态变量之间的协方差。
在卡尔曼滤波器中,协方差矩阵同样分为预测协方差矩阵和更新协方差矩阵:
- 预测误差协方差矩阵:通过系统动态模型从先前的误差协方差矩阵得到当前时间步的预测误差协方差矩阵。
P k − = A P k − 1 A T + Q P_k^- = A P_{k-1} A^T + Q Pk−=APk−1AT+Q
这里, P k − P_k^- Pk− 是预测误差协方差矩阵, Q Q Q 是过程噪声协方差矩阵。 - 更新误差协方差矩阵:结合预测误差协方差矩阵和测量噪声协方差矩阵更新误差协方差矩阵。
P k = ( I − K k H k ) P k − P_k = (I - K_k H_k) P_k^- Pk=(I−KkHk)Pk−
两者的比较
- 状态估计:是一个向量,表示系统的状态变量的估计值。
- 误差协方差矩阵:是一个矩阵,表示状态估计的误差及其不确定性。
project 方法
该方法将状态分布投影到测量空间,这是更新步骤的一部分,用于计算测量预测和测量预测的协方差。
def project(self, mean, covariance):"""将状态分布投影到测量空间。参数----------mean : ndarray状态的均值向量(8维数组)。covariance : ndarray状态的协方差矩阵(8x8维)。返回-------(ndarray, ndarray)返回给定状态估计的投影均值和协方差矩阵。"""# 计算测量噪声标准差std = [self._std_weight_position * mean[3],self._std_weight_position * mean[3],1e-1,self._std_weight_position * mean[3]]innovation_cov = np.diag(np.square(std))# 投影均值到测量空间mean = np.dot(self._update_mat, mean)# 计算投影后的协方差矩阵covariance = np.linalg.multi_dot((self._update_mat, covariance, self._update_mat.T))return mean, covariance + innovation_cov
- 输入:状态均值向量 mean 和状态协方差矩阵 covariance。
- 过程:计算测量噪声协方差 innovation_cov。使用 self._update_mat 将状态均值投影到测量空间。使用 self._update_mat 计算投影后的协方差矩阵。
- 输出:投影后的均值和协方差矩阵。
这对应于卡尔曼滤波的预测测量和预测测量的协方差:
z ^ k = H k x ^ k − \hat{z}_k = H_k \hat{x}_k^- z^k=Hkx^k−
S k = H k P k − H k T + R S_k = H_k P_k^- H_k^T + R Sk=HkPk−HkT+R
update 方法
该方法运行卡尔曼滤波器的更新步骤,使用新测量值来更新状态估计和协方差矩阵。
def update(self, mean, covariance, measurement):"""运行卡尔曼滤波器的校正步骤。参数----------mean : ndarray预测状态的均值向量(8维)。covariance : ndarray状态的协方差矩阵(8x8维)。measurement : ndarray4维测量向量(x, y, a, h),其中(x, y)是边界框的中心位置,a是长宽比,h是高度。返回-------(ndarray, ndarray)返回校正后的状态分布。"""# 计算投影的均值和协方差矩阵projected_mean, projected_cov = self.project(mean, covariance)# 计算卡尔曼增益chol_factor, lower = scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)kalman_gain = scipy.linalg.cho_solve((chol_factor, lower), np.dot(covariance, self._update_mat.T).T,check_finite=False).Tinnovation = measurement - projected_mean# 更新状态均值和协方差矩阵new_mean = mean + np.dot(innovation, kalman_gain.T)new_covariance = covariance - np.linalg.multi_dot((kalman_gain, projected_cov, kalman_gain.T))return new_mean, new_covariance
- 输入:预测状态均值向量 mean、状态协方差矩阵 covariance 和测量值 measurement。
- 过程:调用 project 方法计算投影后的均值和协方差矩阵。使用 scipy.linalg.cho_factor 和 scipy.linalg.cho_solve 计算卡尔曼增益 kalman_gain。计算测量创新 innovation,即测量值与预测测量值的差异。更新状态均值 new_mean 和协方差矩阵 new_covariance。
- 输出:更新后的状态均值和协方差矩阵。
这对应于卡尔曼滤波的更新步骤:
K k = P k − H k T ( H k P k − H k T + R ) − 1 K_k = P_k^- H_k^T (H_k P_k^- H_k^T + R)^{-1} Kk=Pk−HkT(HkPk−HkT+R)−1
x ^ k = x ^ k − + K k ( z k − z ^ k ) \hat{x}_k = \hat{x}_k^- + K_k (z_k - \hat{z}_k) x^k=x^k−+Kk(zk−z^k)
P k = ( I − K k H k ) P k − P_k = (I - K_k H_k) P_k^- Pk=(I−KkHk)Pk−
卡尔曼增益
卡尔曼增益是卡尔曼滤波器中的一个关键参数,用简单易懂的方式来解释的话,可以把它看作是一个调节器,它用来平衡两个信息来源的权重:我们对当前状态的预测和从测量中得到的新信息。
解释
- 预测与测量:
- 假设你在猜测某个东西的当前状态(比如一个移动的物体的位置)。
- 你有一个对这个位置的预测,这是基于你对这个物体运动规律的理解和之前的状态。
- 同时,你也有一个新测量的数值,可能是通过某个传感器获得的,这个测量有一定的误差。
- 谁更可靠?:
- 卡尔曼增益就是一个“智能的调节器”,它会根据预测和测量的可靠性来决定给哪个更多的权重。
- 如果你的预测非常可靠(比如你的模型非常准确),而测量的误差很大,那么卡尔曼增益会倾向于相信预测,给预测更多的权重。
- 如果你的测量非常精确(误差很小),而预测的不确定性很高,那么卡尔曼增益会倾向于相信测量,给测量更多的权重。
- 动态调整:
- 卡尔曼增益不是固定的,它会随着每一步的预测和测量结果动态调整。每次新信息进来时,卡尔曼增益都会重新计算,以确保它在当前情况下做出最佳决策。