问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

卡尔曼滤波:从理论到应用的简介

创作时间:
作者:
@小白创作中心

卡尔曼滤波:从理论到应用的简介

引用
CSDN
1.
https://m.blog.csdn.net/chenxiemin/article/details/143808727

卡尔曼滤波(Kalman Filter)是一种递归算法,用于对一系列噪声观测数据进行动态系统状态估计。它广泛应用于导航、控制系统、信号处理、金融预测等多个领域。本文将介绍卡尔曼滤波的基本原理、核心公式和应用案例。

1. 什么是卡尔曼滤波?

卡尔曼滤波由鲁道夫·卡尔曼在1960年提出,是一种基于最小均方误差准则的最优估计方法。简单来说,卡尔曼滤波使用当前的系统状态和新的测量数据来更新状态估计,并将噪声最小化,从而提供更准确的状态估计。

卡尔曼滤波的主要特点是它是递归的,这意味着它可以实时处理数据,不需要存储整个数据序列。卡尔曼滤波经常使用在:

  1. 导航和定位:卡尔曼滤波在GPS导航、飞机和导弹控制系统中广泛应用,用于实时跟踪物体的位置和速度。
  2. 金融领域:在股票价格预测、波动率估计等金融模型中,卡尔曼滤波可以用来平滑价格信号,估计价格趋势。
  3. 信号处理:在音频和视频的去噪处理中,卡尔曼滤波可以滤除观测信号中的随机噪声。

2. 应用案例

我们希望通过安装在汽车上的GPS传感器来实时获取汽车的位置,但由于GPS信号可能会受到干扰和噪声的影响,直接使用原始GPS数据来估计汽车位置可能不够准确。我们可以通过卡尔曼滤波来减少噪声影响,得到更平滑、更准确的汽车位置估计。卡尔曼滤波通过结合估计误差和测量误差,来减少最终的估计误差,从而获得更精确的结果。其核心思想是加权融合预测值和测量值,赋予更可靠的信息更高的权重。

1. 测量误差

测量误差是指通过传感器获取的数据的准确性。例如,汽车使用GPS来确定位置,但由于外界环境的影响(如高楼遮挡、信号干扰等),GPS数据中可能包含噪声。测量误差反映了传感器测量的精度:

  • GPS数据中的位置可能偏离汽车的真实位置,这种偏差就构成了测量误差。
  • 在卡尔曼滤波中,用测量噪声协方差矩阵 R来描述测量误差的大小。测量误差越小,表示GPS数据越可靠。

2. 估计误差

估计误差是指根据系统模型对状态的预测可能不够准确。例如,我们假设汽车以恒定速度运动,可以通过汽车的初始速度和行驶时间预测当前车辆位置,而实际情况下汽车可能会加速或减速。由于模型无法完全准确地描述汽车的真实运动行为,因此预测的位置信息也会存在误差。

  • 这种预测偏差就是估计误差,它表示模型本身的不确定性和不精确性。
  • 在卡尔曼滤波中,用预测误差协方差矩阵 P来描述估计误差的大小。估计误差越小,表示模型对真实状态的描述越准确。

3. 结合测量和估计误差

卡尔曼滤波通过一个称为卡尔曼增益的动态系数,综合测量误差和估计误差,来平衡预测值和测量值:

  • 如果测量误差较大(即传感器数据不可靠),卡尔曼滤波会更依赖预测值,即模型预测的结果。
  • 如果估计误差较大(即模型预测不准确),卡尔曼滤波会更依赖传感器的测量值,即GPS数据。

最终,通过这种方式,卡尔曼滤波器可以得到一个结合了测量和估计误差的平滑估计结果,从而准确跟踪汽车的位置。

3. 卡尔曼滤波的基本数学原理

卡尔曼滤波的过程可以分为两步:预测(Prediction)和更新(Update)。

  1. 预测步骤:根据当前状态估计和控制输入,预测下一个时刻的状态和不确定性。
  • 状态预测:
  • 误差协方差预测:
    其中:
  • A 是状态转移矩阵。
  • B 是控制输入模型。
  • 是控制输入。
  • Q 是过程噪声的协方差矩阵。
  1. 更新步骤:结合测量值更新状态估计。
  • 卡尔曼增益计算:
  • 状态更新:
  • 误差协方差更新:
    其中:
  • H 是测量矩阵。
  • 是观测值。
  • R 是测量噪声的协方差矩阵。
  • 是卡尔曼增益,它平衡了预测与观测之间的权重。

4. 实例:Python实现卡尔曼滤波

我们有一个资产价格序列 [101.2,102.5,98.5,100.8],这个序列包含噪声(通常的金融数据就是这种情况),我们希望通过Kalman 滤波器来平滑这些噪声,以得到一个更稳定的价格估计,获取资产的 '真实' 价格。

import numpy as np
import matplotlib.pyplot as plt
from pykalman import KalmanFilter

# Given price series (observed prices)
observed_prices = [101.2, 102.5, 98.5, 100.8]

# Initialize the Kalman Filter
kf = KalmanFilter(initial_state_mean=observed_prices[0], n_dim_state=1, n_dim_obs=1)

# Transition matrix (Assuming simple constant value model)
kf.transition_matrices = np.array([[1]])

# Observation matrix (We observe the price directly)
kf.observation_matrices = np.array([[1]])

# Initial state covariance (How uncertain we are about the initial state)
kf.initial_state_covariance = 1

# Measurement noise covariance (Assume some noise in the observations)
kf.observation_covariance = 1  # You can tweak this to change the weight given to observations

# Process noise covariance (Assume some process noise)
kf.transition_covariance = 0.1  # This is the model's uncertainty about how the price evolves

# Apply Kalman Filter to the observed price series
filtered_state_means, filtered_state_covariances = kf.filter(observed_prices)

# Plot the observed prices and the Kalman Filter smoothed prices
plt.plot(observed_prices, label='Observed Prices', marker='o', linestyle='dashed', color='gray')
plt.plot(filtered_state_means, label='Filtered Prices (Kalman)', marker='x', color='blue')
plt.xlabel('Time Step')
plt.ylabel('Price')
plt.title('Kalman Filter Price Estimation')
plt.legend()
plt.show()

# Output the filtered price estimates
print("Filtered Price Estimates:")
for t, price in enumerate(filtered_state_means):
    print(f"Time Step {t+1}: Filtered Price = {price[0]:.2f}")

下图为运行结果:

5. 步骤解释

1. Kalman 滤波器的设置

首先,我们定义 Kalman 滤波器中的各个组件:

  1. 状态:在这里,状态是我们对真实价格的估计。我们用一个变量来表示它,即当前时刻的估计价格。
  2. 观测:这是我们实际观察到的价格数据,这些数据可能包含噪声。
  3. 状态转移模型:我们假设价格在每个时间步不会有剧烈变化,所以我们的状态转移矩阵是

    1
    ,意味着预测的价格与前一个估计值相同。
  4. 测量模型:由于我们直接观测到价格,所以观测矩阵也是
    1
  5. 噪声模型
  • 过程噪声协方差Q:表示价格随时间变化的内在不确定性,假设为
    0.1
  • 观测噪声协方差R:表示测量中可能的噪声,假设为
    1
  1. 初始设置
  • 初始价格设为
    101.2
  • 初始的不确定性协方差设为
    1

在这一步,我们还没有进行预测或更新,因为这是滤波器的起点。

2. 初始化

在开始时,初始状态为第一个观测值,即
101.2
。初始的不确定性(即估计的方差)设为
1
。在这一步,我们还没有进行预测或更新,因为这是滤波器的起点。

3. 时间

t=1
:第一个预测和更新

预测步骤:

  • 预测值:假设价格在时间步之间保持不变,因此预测的价格和之前估计的价格一致。
  • 预测不确定性:基于过程噪声增加的不确定性,从
    1
    增加到
    1 + Q
    (过程噪声为
    0.1
    ):

更新步骤:

  • 观察值:我们观察到时间
    t=1
    的价格是
    102.5
  • 计算 Kalman 增益
    Kalman 增益
    告诉我们在预测值和观测值之间我们有多少信任。
  • 更新估计:使用 Kalman 增益来调整预测值:
    这里,预测值和观测值的差值是
    102.5 - 101.2 = 1.3
    ,调整后的估计为
    101.69
  • 更新不确定性

4. 时间

t=2
:第二次预测和更新

预测步骤:

  • 预测值:使用上一步的估计
    101.69
    作为下一步的预测:
  • 预测不确定性:由于模型噪声增加,预测的不确定性为

更新步骤:

  • 观察值:时间
    t=2
    的价格观测值是
    98.5
  • 计算 Kalman 增益
  • 更新估计
    这里,预测值和观测值的差值是
    98.5 - 101.69 = -3.19
    ,调整后的估计为
    100.66
  • 更新不确定性

5. 时间

t=3
:第三次预测和更新

预测步骤:

  • 预测值:使用上一步的估计
    100.66
    作为下一步的预测:
  • 预测不确定性:由于过程噪声,预测的不确定性变为
    0.384 + 0.1

更新步骤:

  • 观察值:时间
    t=3
    的观测价格是
    100.8
  • 计算 Kalman 增益
  • 更新估计
    这里,预测值和观测值的差值是
    100.8 - 100.66 = 0.14
    ,调整后的估计为
    100.7
  • 更新不确定性

6. 卡尔曼滤波的优缺点

优点:

  • 实时更新:适合实时系统。
  • 噪声鲁棒性:能够有效滤除噪声,尤其适用于高斯噪声环境。
  • 资源效率:计算复杂度低,适合嵌入式系统实现。

缺点:

  • 模型依赖:卡尔曼滤波假设模型线性且噪声为高斯分布,在非线性或噪声不服从正态分布的系统中表现欠佳。
  • 初始状态敏感:初始状态和协方差的设定影响收敛速度。

7. 总结

在应用 Kalman 滤波器时,需要定义三个关键矩阵来控制价格的预测和更新过程。具体来说,这三个矩阵是:

1.状态转换矩阵 A

  • 作用:状态转换矩阵用来描述系统状态的变化情况。在我们的例子中,它表示价格在时间步之间如何变化。
  • 解释:这个矩阵决定了如何从一个时间步的状态(价格估计)预测下一个时间步的状态。比如,如果你假设价格在短期内保持稳定,可以将 A设置为
    1
    (这表示预测的价格和前一个时间步相同)。如果有更复杂的模型(如价格可能随着时间线性增加),你可以在 A中引入更多参数。
  • 示例:在价格平滑的例子中,简单情况下 A=1。

2.过程噪声协方差矩阵 Q

  • 作用:过程噪声矩阵 Q 描述的是系统内在的不确定性,表示我们对模型如何演变的不完全信任程度。
  • 解释:Q 用来表示系统本身的随机性或模型的简化程度。更高的 Q值意味着我们认为系统有更多的随机波动,较低的 Q值表示对系统的信任度较高。在金融时间序列中,这种不确定性可能来自市场的内在波动。
  • 示例:在我们的例子中,Q 设置为
    0.1
    ,表示我们对每个时间步的价格变化有一定的随机波动预期。

3.观测噪声协方差矩阵 R

  • 作用:观测噪声矩阵 R 表示外部的测量不确定性,即观测数据中的噪声。
  • 解释:这是观测数据中可能存在的随机误差,例如由于市场的短期波动、交易异常或其他外部因素导致的观测误差。一个较高的 R值表示观测数据的噪声较大,较低的 R值表示观测数据比较可靠。
  • 示例:在我们的例子中,R 设置为
    1
    ,表示市场观测中可能存在的波动。

卡尔曼滤波是一种强大的估计工具,在动态系统的状态估计中表现出色。它通过递归更新,将预测和测量结合,从而在各种噪声环境中提供稳定、准确的估计结果。在未来的发展中,卡尔曼滤波还将与非线性滤波和机器学习方法相结合,进一步拓宽其应用领域。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号