问题标签 [pykalman]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
928 浏览

filter - KALMAN 过滤器不响应更改

我第一次实现卡尔曼滤波器以从源获取电压值。它工作并稳定在源电压值,但如果源改变电压,则滤波器不会适应新值。

我使用 3 个步骤:

  1. 获得卡尔曼增益

    /li>
  2. 获取当前估计

    /li>
  3. 计算估计误差

    /li>

问题是,随着 0 <= KG <= 1,Error_in_estimate 越来越小,这使得 KG 越来越小(error_in_measurement是一个常数),所以最后的估计只取决于之前的估计和当前的估计测量不考虑

这可以防止过滤器自己适应测量变化。

我该怎么做才能做到这一点?

谢谢


编辑:

回复克拉斯:

我不确定卡尔曼滤波器对我的问题是否有效,因为我没有系统模型,我只是从一个相当嘈杂的传感器中获得了一堆读数,测量一个不太可预测的变量。

为简单起见,假设读取用户更改的电位器(可变电阻器),您无法预测或模拟用户的行为。

我已经实现了一个非常基本的 SMA(简单移动平均线)算法,我想知道是否有更好的方法来做到这一点。

卡尔曼滤波器对这样的问题有效吗?

如果没有,你有什么建议?

第二次编辑

感谢 Claes 提供如此有用的信息

我一直在 MathLab 中进行一些数值测试(还没有实际数据),并且使用高斯滤波器进行卷积似乎给出了最准确的结果。

卡尔曼测量方差 R=0.1^2 不好的结果

使用卡尔曼滤波器,我不知道如何估计过程和测量方差,有什么方法吗?只有当我减少了相当多的测量方差时,卡尔曼滤波器似乎才能适应。在上一张图片中,测量方差为 R=0.1^2(原始示例中的那个)。这是 R=0.01^2 的相同测试

卡尔曼测量方差 R=0.01^2 更好的结果

当然,这些是没有真实数据的 MathLab 测试。明天我将尝试用真实数据在真实系统中实现这个过滤器,看看我是否能得到类似的结果

0 投票
0 回答
790 浏览

python - 如何在python中使用控制变量拟合卡尔曼滤波器

我想使用卡尔曼滤波器来拟合我的数据并进行预测。我的数据包含控制变量,因此例如它可能如下所示:

U控制变量在哪里,并且X是 3 个连续时间戳的观察值。我想将过滤器参数拟合到这些数据,然后预测下一个观察结果(我也有控制变量)。

我尝试使用pykalmanpackage。它有一个适合过滤器参数的 em 函数,但它似乎不包括控制变量作为可能的输入(除非我遗漏了什么?)

我尝试的另一个选项是filterpy.kalman.KalmanFilter。它确实允许输入控制变量,但我不明白如何使用这个包来估计过滤器的参数。这些软件包中的任何一个都可以完成这项工作,或者如果没有,是否还有其他可能有用的软件包?

0 投票
0 回答
109 浏览

pykalman - Pykalman AdditiveUnscentedKalmanFilter 初始化

我正在尝试使用 pykalman 的 AdditiveUnscentedKalman 过滤器。我得到了嘈杂的 x,y 值,我试图将 x,y,xdot,ydot 从过滤器中取出。

我正在从过滤器中获取值,但这不是我所期望的。State: [[ 481.65737052 477.23904382 0. 0. ] [ 659.29999618 659.28265402 58.33365188 59.77883149]] Obs: [478, 660, -0.4666666666666667, -0.36666666666666664, -2.4756234162106834, 1.2145259141964182]

obs[0] 和 obs[1] 是测量的 xy,而 state 是从过滤器中出来的。state[0][0] 和 state[1][0] 看起来是 x,y,而 state[0][1] 和 state[1][1] 似乎是 x,y。我不知道其他数字应该是什么,因为它们是不可接受的速度。

如果有人可以验证我正在使用正确的转换功能,那将不胜感激。

我很困惑,因为 .filter 调用的输出是一个 2X4 的矩阵,我希望它是一个 1X4。

0 投票
0 回答
372 浏览

python - PyKalman EM 在简单模拟中不起作用

我正在尝试使用卡尔曼滤波器来估计参数,使用 PyKalman,我遇到了转换矩阵估计的问题。它总是返回 1.0。看这个简单的例子:

观察结果与潜在状态变量相同,如观察矩阵所示,噪声协方差均为 0。同样,状态变量每次迭代都简单地乘以 alpha,但模型适合 alpha 的 1.0。这里会发生什么?我能够在其他示例中拟合协方差,只有转换矩阵无法拟合。

0 投票
0 回答
287 浏览

python - 使用 Pykalman (Python) 方法的 R 中的卡尔曼滤波器

下午好!

我有一个使用 Pykalman ( https://pykalman.github.io/ ) 在 Python 中创建的代码,我没有为卡尔曼滤波器指定任何参数,只是我观察的维数。初始值自动初始化(例如转换矩阵的恒等式),然后使用 EM 算法优化卡尔曼滤波器的参数。完成后,我们最终计算过滤器预测的值。

我很难对 R 做同样的事情。我使用“dle”包(https://cran.r-project.org/web/packages/dlmodeler/dlmodeler.pdf)。然后我启动我的模型并使用拟合(带有 84 列和 2 行的 ya 矩阵):

然后我得到这个错误:

dlmodeler.build.function(model) 中的错误:尚未实现多变量案例

你有什么想法,这不起作用,我应该在我的方法中修改什么?

谢谢。

0 投票
1 回答
2013 浏览

kalman-filter - Pykalman 的 EM 算法

我正在尝试使用 实现卡尔曼滤波器的简单应用程序Pykalman,但我在Pykalman软件包附带的 EM 算法的估计步骤上遇到错误。

它是基于模拟数据的具有时变系数的简单线性回归。下面的代码模拟数据并启动卡尔曼滤波器,但是当我尝试根据观察估计参数时,使用kf.em(Data),它返回错误:ValueError: object arrays are not supported

我做错了pykalman什么吗?

型号和完整代码如下。错误发生在代码的最后一行。

模型(小图)

问题描述

模型的状态空间表示

完整代码

0 投票
1 回答
401 浏览

python - Pykalman with non-square observation matrix

In the documentation of Pykalman it says that it only accepts square matrices for the observation_matrices and transition_matrices arguments.

Is there a way around this? I have to estimate a state-space system with a non-square observation matrix. Using the Pykalman notation, its dimensions would be [n_dim_obs, n_dim_state].

I could not find any other kalman filter library that accepts non-square observation matrices and has a loglikelihood method.

0 投票
1 回答
11213 浏览

python - 在原始加速度数据上使用 PyKalman 计算位置

这是我在 Stackoverflow 上的第一个问题,如果我用词不当,我深表歉意。我正在编写代码以从 IMU 获取原始加速度数据,然后将其集成以更新对象的位置。目前,此代码每毫秒读取一个新的加速度计,并使用它来更新位置。我的系统有很多噪音,即使使用我实施的 ZUPT 方案,也会由于复合错误导致疯狂的读数。我知道卡尔曼滤波器理论上是这种情况的理想选择,我想使用 pykalman 模块而不是自己构建一个。

我的第一个问题是,pykalman 可以这样实时使用吗?从文档来看,在我看来,您必须记录所有测量结果,然后执行平滑操作,这不切实际,因为我想每毫秒递归过滤一次。

我的第二个问题是,对于转换矩阵,我只能将 pykalman 应用到加速度数据本身,还是可以以某种方式将双重积分包含到位置?那个矩阵会是什么样子?

如果 pykalman 在这种情况下不实用,还有其他方法可以实现卡尔曼滤波器吗?先感谢您!

0 投票
1 回答
608 浏览

python - 我想使用 pykalman 模块计算线性拟合的斜率和截距

Y考虑关于的线性回归X,其中(xi, yi) = (2, 7), (0, 2), (5, 14) for i = 1, 2, 3。解决方案是(a, b) = (2.395, 2.079),使用手持计算器上的回归函数获得。

我想使用该pykalman模块计算线性拟合的斜率和截距。我越来越

如果有人能帮助我,我将不胜感激。

这是我的代码:

0 投票
1 回答
4329 浏览

pandas - 具有不同时间步长的卡尔曼滤波器

我有一些数据表示从两个不同传感器测量的物体的位置。所以,我需要做传感器融合。更困难的问题是来自每个传感器的数据基本上是随机到达的。我想使用 pykalman 来融合和平滑数据。pykalman 如何处理可变时间戳数据?

数据的简化示例如下所示:

和这个:

对于传感器融合问题,我认为我可以重塑数据,以便我的位置 X1、Y1、X2、Y2 有一堆缺失值,而不仅仅是 X、Y。(这是相关的: https ://stackoverflow.com/questions/47386426/2-sensor-readings-fusion-yaw-pitch )

那么我的数据可能如下所示:

pykalman 的文档表明它可以处理丢失的数据,但这是正确的吗?

但是,pykalman 的文档并不清楚可变时间问题。文档只是说:

“卡尔曼滤波器和卡尔曼平滑器都能够使用随时间变化的参数。为了使用它,只需沿其第一个轴传入长度为 n_timesteps 的数组:”

我找不到任何使用具有可变时间步长的 pykalman Smoother 的示例。因此,任何使用我上述数据的指导、示例甚至示例都会非常有帮助。我没有必要使用 pykalman,但它似乎是一个有用的工具来平滑这些数据。

*****在@Anton 下面添加了其他代码我制作了一个使用平滑功能的有用代码版本。奇怪的是,它似乎以相同的权重对待每一次观察,并且轨迹贯穿每一次。即使,如果传感器方差值之间存在很大差异。我预计在 5.4、5.0 点附近,过滤后的轨迹应该更接近传感器 1 点,因为该点的方差较小。相反,轨迹准确地到达每个点,并大转弯到达那里。