问题标签 [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 回答
415 浏览

python - 卡尔曼滤波器 2d 与 pykalman

我正在尝试在 GPS 数据集上使用卡尔曼滤波器来降低噪声。为此,我检查了是否已经有在线实现并找到了 pykalman。我正在尝试使用它,但由于某种原因,我没有得到我应该如何正确分配矩阵。当我尝试运行它时,它告诉我我有尺寸错误。所以首先,我想要做/得到什么:我希望卡尔曼滤波器用旧的位置 + 速度 * t 估计下一个时间步的位置。下一步的速度就是旧的速度。每个时间步长是 1 秒。我在 x 和 y 方向上进行了测量,对于 x_t,y_t,vx_t,vy_t,Transition 矩阵应该看起来像这样(我认为):

我的测量结果如下所示:

到目前为止我尝试了什么:我试图拼凑起来,它是如何从各种在线资源中工作的,并想出了这个:

尝试运行最后一部分会给我以下错误:

形状 (2,1) 和 (2,) 未对齐:1 (dim 1) != 2 (dim 0)

据我所知,所使用的矩阵没有正确的尺寸可以相互使用。一般来说,我对矩阵的理解非常有限。我希望有一个人可以帮助我。

0 投票
1 回答
90 浏览

python - 应用卡尔曼滤波使用 GeoCordinates 跟踪用户的移动性

我正在尝试实现一个简单的卡尔曼过滤器,该过滤器将用于使用一组地理坐标或来自 twitter 推文地理数据的位置 ID 来跟踪用户移动。

本质上,我正在使用 Twitter 数据计算移动模式?给定大量推文,其中一些带有地理坐标,一些带有位置 ID,我们可以使用(或开发)哪些方法来检查用户去哪里,他们移动了多少,以及他们什么时候回到“家”。

任何人都可以对此有所了解吗?

0 投票
1 回答
2785 浏览

python - 从 Python 上的 IMU 传感器获取 3D 位置坐标

我计划从包含加速度计和陀螺仪的 IMU(惯性传感器)获取 3D 笛卡尔坐标中的位置。我正在使用它来跟踪 3D 中的对象位置和轨迹。

1-根据我有限的知识,我假设仅加速​​度计就足够了,导致xyz轴A(Ax,Ay,Az)的加速度,需要积分两次才能获得速度和位置,但积分会增加一个未知的常数值,这种称为漂移的误差会随着时间的推移而增加。如何消除此错误?

2-此外,为什么首先需要陀螺仪,我们不能仅将 xyz 轴加速度转换为位移,如果加速度计告诉运动轴,那么为什么要从陀螺仪检查方向。抱歉,这是一个非常基本的问题,我在任何地方都检查过 Gyro+Accel 都被使用但不知道为什么。

3-即使在静止且没有任何运动时,地球的重力也会作用在传感器上,其值总是比传感器运动所产生的值更大。你如何消除重力?

完成此操作后,将对它们应用卡尔曼滤波器以融合它们并平滑值。对于不能选择 GPS 的环境,这种方法对物体的轨迹估计有多准确。我从arduino获取加速度计和陀螺仪值,然后导入到Python中,它将被绘制在实时更新的 3D 图形上。任何帮助将不胜感激,尤其是类似代码的链接。

0 投票
0 回答
111 浏览

python - 使用 pykalman 2d 过拟合的卡尔曼滤波器

我正在使用卡尔曼平滑器根据 GPS 点估计一个人的路径。前段时间我已经有一个问题,这里回答得很好:kalman filter 2d with pykalman。但是现在我遇到了问题,卡尔曼滤波器严重过度拟合这些点。平均到测量点的平均距离变化为 0.00016 m。所以我的问题是,如何防止卡尔曼滤波器过度拟合?

我的代码:

我在这里还是很新,所以欢迎任何反馈,我可以如何改进我的问题。

0 投票
0 回答
188 浏览

python - python statsmodels:带有矩阵参数的自定义状态空间

我需要拟合如下状态空间模型:

y_t = Z\alpha_t + d + \epsilon_t; \quad \epsilon_t ~ N(0, diag(\sigma^2_\epsilon))

\alpha_{t+1} = T \alpha_t + \eta_t; \eta ~ N(0, I)

使用y_t一个d维向量(在我的情况下为d ~100)和 \alpha_t k维。

即,具有时不变矩阵和对角噪声观测协方差的“简单”线性状态空间模型。如果不是对角协方差,pykalman就可以完成这项工作。但是,据我了解,它不允许将观察协方差限制为对角线(您可以完全修复它或让它在没有约束的情况下进行估计)。

因此,我转向statsmodels并尝试自定义sm.tsa.statespace.MLEModel,但我不知道如何进行。我能找到的所有示例都导致要估计的标量参数很少,并且它们是通过该param_names方法显式声明的,但我不知道如何处理矩阵参数。

我正在做这样的事情:

抛开我仍然怀念一个set_params方法,感觉这种做法真的很牵强:有没有更直接的方法来处理矩阵参数,而不必给矩阵的每个条目起个名字?

self.ssm["transition"]此外,使用,比如说,而不是self["transition"](我在例子中都看到过)有什么区别?

感谢您的任何建议!

0 投票
1 回答
366 浏览

python - Scipy“不支持屏蔽数组”错误

我正在尝试使用 pykalman 和 scipy 优化器校准模型。由于某些原因,scipy 似乎认为我的输入是一个掩码数组,但事实并非如此。我添加了以下代码:

运行 scipy 优化器我得到错误:

也许与 scipy 库中的更新有关?它适用于不同的设置,所以这就是我能想到的。我的版本是:Python 3.8.5 Scipy 1.5.2 Pykalman 0.9.5

谢谢!

0 投票
0 回答
109 浏览

python - Pykalman filter.update() 批处理 vs 循环

我已经建立了一个卡尔曼滤波器函数,它基本上执行以下操作:

因此,在样本中使用,过滤器返回状态的均值和协方差(在样本中)。

现在:假设我x_oos的样本数据不足。我想使用估计的卡尔曼滤波器,使用filter_update().

我确信,filter_update()在循环中使用该函数,我会得到我想要的实际结果(逐步估计状态均值和 covs,在每个时间步更新)。

但是,我想filter_update()在一批数据上使用,这可能会更快,而且无论如何都会节省代码。但是当我这样做时:

我得到第一个变量的多个值(状态均值),但只有一个协方差值。

此外,使用以下内容针对循环进行测试:

在 oos2m 和 oos1m 中产生不同的结果(第一个值除外)。

我错过了什么?我认为oos1m在某种程度上是错误的(做一些不同于递归预测的事情)。我怀疑filter_update()我的输入变量在观察中是一个单一的值,如果你提供更多的值,它会(出乎意料地)对所有其他值产生影响。

0 投票
0 回答
26 浏览

python - 卡尔曼滤波器具有恒定方差

我正在使用 Pykalman 来拟合单变量 (1d) 卡尔曼滤波器。虽然filter_state_means随着时间的推移不断变化,但filtered_state_covariance在采用几个数据点收敛后,它是恒定的。

这就是我正在做的事情:

在此处输入图像描述

我究竟做错了什么 ?

谢谢你。

0 投票
0 回答
13 浏览

artificial-intelligence - 如何向扩展卡尔曼滤波器添加噪声?

除了尝试和错误方法之外,还有其他方法可以确定噪声协方差矩阵(Q & R)吗?因为我只能访问模型的模拟,并且在模拟中优化的参数在实际应用中可能无法按预期工作。我在想也许有一种方法可以用一些随机值初始化 Q 和 R,并通过一些技术让它们收敛。

0 投票
0 回答
20 浏览

python - 从滚动窗口对多列应用函数

我正在尝试计算 DataFrame 中两列之间的滚动 beta。

我自己解释一下,beta(金融)经典地回答了以下公式:cov(asset_1,asset_2)/var(asset_2)。对于我的情况,我想使用卡尔曼滤波器计算滚动 beta。然后用经典的 beta 公式初始化这个卡尔曼滤波器。

我的问题如下:我有一个包含两列(asset_1 和asset_2)的数据框。还有一个 beta_kalman(s1,s2) 函数(使用 pykalman)。

beta kalman 函数将对应于 s1=asset_1 和 s2=asset_2 的两个系列作为参数。

目前,我通过一个简单的方法通过 for 循环通过在我的函数中提供窗口上每个资产的相应值来在每个增量处移动 1 的索引。

问题是执行时间太长。

他有办法减少这个计算时间吗?我在想象类似的东西: df.rolling(window).apply(beta_kalman) 但这不起作用。

你有一个解决方案的想法吗?

注意:我必须在 python 3.6.3 和 pandas 0.20.3 下实现这个

提前感谢您的想法!

示例数据,以及重新创建以下问题所需的最少代码:

我用 pykalman 计算 beta 的函数:

样本数据 :

我实际上在做什么,这很有效,但是很长:

我想做的事 :

我得到的错误:

这个错误是合乎逻辑的,因为 apply 只有一个参数传递给 beta_kalman 函数。但问题是通过 apply 作为参数传递的内容对应于第一列 (asset_1) 值的数组 (shape=(5,)),而不是两列。