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

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

1. 什么是卡尔曼滤波?

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

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

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

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

  1. 预测步骤:根据当前状态估计和控制输入,预测下一个时刻的状态和不确定性。

    • 状态预测:\hat{x}_{k|k-1} = A \hat{x}_{k-1|k-1} + B u_k
    • 误差协方差预测:P_{k|k-1} = A P_{k-1|k-1} A^T + Q

    其中:

    • A 是状态转移矩阵。
    • B 是控制输入模型。
    • u_k​ 是控制输入。
    • Q 是过程噪声的协方差矩阵。
  2. 更新步骤:结合测量值更新状态估计。

    • 卡尔曼增益计算:K_k = P_{k|k-1} H^T (H P_{k|k-1} H^T + R)^{-1}
    • 状态更新:\hat{x}_{k|k} = \hat{x}_{k|k-1} + K_k (z_k - H \hat{x}_{k|k-1})
    • 误差协方差更新:P_{k|k} = (I - K_k H) P_{k|k-1}

    其中:

    • H 是测量矩阵。
    • z_k​ 是观测值。
    • R 是测量噪声的协方差矩阵。
    • K_k​ 是卡尔曼增益,它平衡了预测与观测之间的权重。

3. 卡尔曼滤波的优缺点

优点:

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

缺点:

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

4. 卡尔曼滤波的实际应用

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

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

我们有一个资产价格序列 [101.2,102.5,98.5,100.8][101.2, 102.5, 98.5, 100.8][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}")

下图为运行结果:

6. 步骤解释

1. Kalman 滤波器的设置

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

  1. 状态:在这里,状态是我们对真实价格的估计。我们用一个变量来表示它,即当前时刻的估计价格。

  2. 观测:这是我们实际观察到的价格数据,这些数据可能包含噪声。

  3. 状态转移模型:我们假设价格在每个时间步不会有剧烈变化,所以我们的状态转移矩阵是 1,意味着预测的价格与前一个估计值相同。

  4. 测量模型:由于我们直接观测到价格,所以观测矩阵也是 1

  5. 噪声模型

    • 过程噪声协方差 Q:表示价格随时间变化的内在不确定性,假设为 0.1
    • 观测噪声协方差 R:表示测量中可能的噪声,假设为 1
  6. 初始设置

    • 初始价格设为 101.2
    • 初始的不确定性协方差设为 1

2. 初始化

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

3. 时间 t=1:第一个预测和更新

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

预测步骤:

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

更新步骤:

  • 观察值:我们观察到时间 t=1 的价格是 102.5

  • 计算 Kalman 增益

        K_1 = \frac{P^-_1}{P^-_1 + R} = \frac{1.1}{1.1 + 1} \approx 0.524

    Kalman 增益 K_1 告诉我们在预测值和观测值之间我们有多少信任。

  • 更新估计:使用 Kalman 增益来调整预测值:

       \hat{x}_1 = \hat{x}^-_1 + K_1 \cdot (z_1 - \hat{x}^-_1) = 101.2 + 0.524 \cdot (102.5 - 101.2) \approx 101.69

    这里,预测值和观测值的差值是 102.5 - 101.2 = 1.3,调整后的估计为 101.69

  • 更新不确定性

       P_1 = (1 - K_1) \cdot P^-_1 = (1 - 0.524) \cdot 1.1 \approx 0.524

4. 时间 t=2:第二次预测和更新

预测步骤:

  • 预测值:使用上一步的估计 101.69 作为下一步的预测: \hat{x}^-_2 = 101.69
  • 预测不确定性:由于模型噪声增加,预测的不确定性为  P^-_2 = 0.524 + 0.1 = 0.624

更新步骤:

  • 观察值:时间 t=2 的价格观测值是 98.5

  • 计算 Kalman 增益

        K_2 = \frac{P^-_2}{P^-_2 + R} = \frac{0.624}{0.624 + 1} \approx 0.384
  • 更新估计

        \hat{x}_2 = \hat{x}^-_2 + K_2 \cdot (z_2 - \hat{x}^-_2) = 101.69 + 0.384 \cdot (98.5 - 101.69) \approx 100.66

    这里,预测值和观测值的差值是 98.5 - 101.69 = -3.19,调整后的估计为 100.66

  • 更新不确定性

        P_2 = (1 - K_2) \cdot P^-_2 = (1 - 0.384) \cdot 0.624 \approx 0.384

5. 时间 t=3:第三次预测和更新

预测步骤:

  • 预测值:使用上一步的估计 100.66 作为下一步的预测:\hat{x}^-_3 = 100.66
  • 预测不确定性:由于过程噪声,预测的不确定性变为 0.384 + 0.1:    P^-_3 = 0.384 + 0.1 = 0.484

更新步骤:

  • 观察值:时间 t=3 的观测价格是 100.8

  • 计算 Kalman 增益

        K_3 = \frac{P^-_3}{P^-_3 + R} = \frac{0.484}{0.484 + 1} \approx 0.326
  • 更新估计

        \hat{x}_3 = \hat{x}^-_3 + K_3 \cdot (z_3 - \hat{x}^-_3) = 100.66 + 0.326 \cdot (100.8 - 100.66) \approx 100.7

    这里,预测值和观测值的差值是 100.8 - 100.66 = 0.14,调整后的估计为 100.7

  • 更新不确定性

      P_3 = (1 - K_3) \cdot P^-_3 = (1 - 0.326) \cdot 0.484 \approx 0.326

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,表示市场观测中可能存在的波动。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac解压包安装MongoDB8并设置launchd自启动

记录一下在mac上安装mongodb8过程,本机是M3芯片所以下载m芯片的安装包,intel芯片的类似操作。 首先下载安装程序包。 # M芯片下载地址 https://fastdl.mongodb.org/osx/mongodb-macos-arm64-8.0.3.tgz # intel芯片下载地址 https://fastdl.mongodb.org…

【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题

问题描述: 在实操中,git push代码到github上一直提示输入用户名及密码,并且跳出的输入框输入用户名和密码后,报错找不到远程仓库 实际解决中,发现我环境有两个问题解决: git push一直提示输入用户名及密码…

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言,旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器,用于将 Rust 安装到 Windows 操作系统中,并配置相关环境。…

mysql 示例验证demo

确保引入了正确的头文件: 在 MySQL C Connector 中,ResultSet 和 Statement 类型的声明需要包含相关的头文件。你需要包括 resultset.h 和 statement.h。 更新代码: 你需要确保程序正确地包含了这些头文件,并且按照正确的顺序使…

【5.线性表-链式表示-王道课后算法题】

王道数据结构-第二章-链式表示算法题 1.在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。2. 试编写在带头结点的单链表L中删除一个最小值结点的高效算法(假设该结点唯一…

manjaro蓝牙鼠标无法连接问题解决

问题描述: 我这边出现的问题是使用图形Bluetooth Manager连接(华为无线鼠标)蓝牙鼠标,会出现连接成功,然后鼠标触发任何动作都会导致连接断开,过一会儿之后会一直出现连接、断开、连接、断开死循环 我的解决…

SSL 证书申请以及配置流程

SSL 证书申请以及配置流程 手动申请免费 SSL 证书的简明指南 如果你希望手动为你的网站申请免费的 SSL 证书,Let’s Encrypt 提供了一个很棒的免费服务。而 Certbot 则是官方推荐的工具,可以帮助你完成证书的申请和配置。以下是如何一步步完成的详细说…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

项目中用户数据获取遇到bug

项目跟练的时候 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading ‘code’) at Proxy.userInfo (user.ts:57:17) 因此我想要用result接受信息的时候会出错,报错显示为result.code没有该值 导致我无法获取到相应的数据 解决如下 给…

【视觉SLAM】1-概述

读书笔记 文章目录 1. 经典视觉SLAM框架2. 数学表述2.1 运动方程2.2 观测方程2.3 问题抽象 1. 经典视觉SLAM框架 传感器信息读取:相机图像、IMU等多源数据;前端视觉里程计(Visual Odometry,VO):估计相机的相…

vue3 中,字段必须在 onShow 前定义?

在Vue 3中,如果你在组件的 setup() 函数中使用了生命周期钩子,比如 onShow,你可能遇到了一个错误,提示你在 onShow 前定义了某个字段。这个错误通常意味着你尝试在组件的 setup() 函数中访问了一个在 onShow 钩子函数被调用之前尚…

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台,适用于做机…

图像处理技术椒盐噪声

椒盐噪声,也称为脉冲噪声,是图像中经常见到的一种噪声。它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。这些白点和黑点会在图像中随机分布,导致图像中…

前端数据可视化库介绍Echarts、D3.js、Plotly、Matplotlib

目录 一、Echarts 1. 简介 2. 优点 3. 缺点 4. 代码示例 二、D3.js 1. 简介 2. 优点 3.缺点 4. 代码示例 三、Plotly 1.简介 2.优点 3.缺点 四、Matplotlib 1.简介 2.优点 3.缺点 一、Echarts 1. 简介 Echarts 是一个由百度开源的数据可视化库,它…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用: 函数的局部变量和全局变量 局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。 money 5000000 n…

机器学习基础04

目录 1.朴素贝叶斯-分类 1.1贝叶斯分类理论 1.2条件概率 1.3全概率公式 1.4贝叶斯推断 1.5朴素贝叶斯推断 1.6拉普拉斯平滑系数 1.7API 2.决策树-分类 2.1决策树 2.2基于信息增益的决策树建立 2.2.1信息熵 2.2.2信息增益 2.2.3信息增益决策树建立步骤 2.3基于基…

The Internals of PostgreSQL 翻译版 持续更新...

为了方便自己快速学习,整理了翻译版本,目前翻译的还不完善,后续会边学习边完善。 文档用于自己快速参考,会持续修正,能力有限,无法确保正确!!! 《The Internals of PostgreSQL 》 不是 《 PostgreSQL14 Internals 》…

gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?

gcc 1.c和g 1.c编译阶段有什么区别? 借用 gcc 1.c和g 1.c有什么区别? 的示例代码,以汇编代码为比较目标,再经过汇编,最后生成ELF文件,三个过程结果均无差异,这个阶段充分证明了c和c是多么相似。 编译到汇编 gcc -S…

Android 无签名系统 debug 版本APK push到设备引起的开机异常问题分析(zygote进程)

问题背景 前置操作: 替换原system/priv-app 目录下已有的应用包未未签名的debug版本,然后重启。 现象: 无法正常开机,卡在开机动画,并且pm没有起来,因为执行adb install 命令是返回“cmd: Cant find se…

深度学习推荐系统的工程实现

参考自《深度学习推荐系统》——王喆,用于学习和记录。 介绍 之前章节主要从理论和算法层面介绍了推荐系统的关键思想。但算法和模型终究只是“好酒”,还需要用合适的“容器”盛载才能呈现出最好的味道,这里的“容器”指的就是实现推荐系统…