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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊Flink:Flink的运行时架构

一、运行时架构 上一篇我们可以看到Flink的核心组件的Deploy层,该层主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群(Standalone/YARN)、云(GCE/EC2)。 Local(本地&am…

元器件封装

元器件封装类型 为什么越来越多用贴片元件,而不是插件元件 为什么越来越多用贴片元件,而不是插件元件 1.体积小、质量小、容易保存和运输; 2.容易焊接和拆卸。抗震效果好。 贴片元件不用过孔,用锡少。直插元件最麻烦的就是拆卸&a…

[JAVAEE] 网络编程

目录 一. 什么是socket套接字 二. socket套接字 2.1 socket套接字根据传输层协议分类 2.2 TCP流套接字 UDP数据报套接字主要特点 三. UDP数据报套接字编程 3.1 DatagramSocket 是UDP socket, 用于发送和接受数据报 3.2 DatagramPacket 是UDP socket 发送和接收的数据报 …

GNN入门案例——KarateClub结点分类

文章目录 一、任务描述二、环境配置三、加载数据四、定义网络结构五、训练模型 一、任务描述 Karate Club 图任务是一个经典的图结构学习问题,通常用于社交网络分析和社区检测。该数据集是由 Wayne W. Zachary 在1977年收集的,描述了一个美国的空手道俱…

173. 二叉搜索树迭代器【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 173. 二叉搜索树迭代器 一、题目描述 实现一个二叉搜索树迭代器类BSTIterator ,表示一个按中序遍历二叉搜索树(BST)的迭代器: BSTIterato…

【lamafactory BLEU ROUGLE L评测】

1、BLEU/ROUGLE评测界面 2、这个是用BLEU 和ROUGL来评测 目录:saves/Qwen2-7B-Chat/lora/eval_2024-11-14-16-28-19/ 在saves文件夹 生成的文件如下 all_results.json文件 说明模型在这个测试集上是不好的 3、可以查看预测结果的文件 predict_result.json

前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)

文章目录 1. npm (Node Package Manager)2. Yarn (Yarn Package Manager)3. pnpm4. Bower5. Parcel总结 前端开发中常用的包管理器主要有以下几个: 1. npm (Node Package Manager) 简介: npm 是 Node.js 的默认包管理器,也是最广泛使用的包…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识,实现简单的一个小案例,网易云音乐热…

SHELL脚本(Linux)

声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…

reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响

目录 Gather Scatter Reduce reduce-scatter:适合分布式计算 Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响 计算结果理论正确性 资源消耗方面 Gather 这个也很好理解,就是把多个进程的数据拼凑在一起。 Scatter 不同于Br…

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理:基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址:https://arxiv.org/abs/2405.14616 源码地址: https://github.com/kwuking/TimeMixer 背景 数据是有连续性,周期性,趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

聊天服务器(8)用户登录业务

目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…

18.UE5怪物视野、AI感知、攻击范围、散弹技能

2-20 怪物视野、AI感知、攻击范围、散弹技能_哔哩哔哩_bilibili 目录 1.AI感知组件 2.AI感知更新的函数 3.攻击范围 4.散弹技能 4.1创建发射物 4.2创建远程攻击方式 4.3散弹自定义事件的实现 4.4动画通知实现攻击 1.AI感知组件 为怪物蓝图添加AI感知组件&#xff0c;…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

安全见闻1-5

涵盖了编程语言、软件程序类型、操作系统、网络通讯、硬件设备、web前后端、脚本语言、病毒种类、服务器程序、人工智能等基本知识&#xff0c;有助于全面了解计算机科学和网络技术的各个方面。 安全见闻1 1.编程语言简要概述 C语言&#xff1a;面向过程&#xff0c;适用于系统…

【计算机网络】TCP协议特点3

心跳机制 什么是心跳机制 心跳机制是在计算机系统、网络通信和许多其他技术领域广泛应用的一种机制&#xff0c;用于检测两个实体之间的连接是否仍然活跃&#xff0c;或者设备是否还在正常运行。就是每隔一段时间发送一个固定的消息给服务端&#xff0c;服务端回复一个固定…

HarmonyOs DevEco Studio小技巧31--画布组件Canvas

那天我们用画布实现了文字颜色的渐变&#xff0c;实际上画布还有很多好玩的功能&#xff0c;接下来让我们一起试一下画布怎么玩 Canvas 提供画布组件&#xff0c;用于自定义绘制图形。 接口 Canvas Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext…

蓝桥杯每日真题 - 第10天

题目&#xff1a;&#xff08;班级活动&#xff09; 题目描述&#xff08;14届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目要求我们找到最小的修改次数&#xff0c;使得任意一名同学的 ID 都与另一名同学的 ID 不相同。可以总结出这是一个寻找“重复数字最少修改…

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…