卡尔曼滤波器在线性趋势上使用 pykalman 是否给出正确答案?

问题描述

我正在尝试使用 KalmanFilter 来估计一个系列的平均值,但我无法找到与线性趋势相关的很多信息,因此我尝试使用它来预测输入时的值只是一条斜率为正的直线。

from pykalman import KalmanFilter as KF
y=np.arange(0,100,1)
y=pd.DataFrame(y)
x=y.shift(1)
x=pd.DataFrame(x,index=np.arange(0,1))
kf = KF(transition_matrices = [1],observation_matrices = [1],initial_state_mean = 10,initial_state_covariance = 1,observation_covariance=1,transition_covariance=.01)

state_means,_ = kf.filter(x.dropna().values)
d={'a':np.asarray(x),'b':np.asarray(state_means)}
sm = pd.DataFrame(state_means,index=x.index[:-1],columns=['state'])
sma=x.rolling(window=10).mean()
x['kalman']=sm
x['rolling']=sma
x.plot(figsize=(10,8))

我能够申请,但我不确定这是否正确。我看到实际值与卡尔曼状态之间的差距意味着:

graph

我认为 KalmanFilter 会完成那个间隙并最终与直线重合,但过了一段时间它们似乎平行。

这是正确的还是我做错了什么?

解决方法

这是我在评论中分享的代码。

from pykalman import KalmanFilter as KF
import numpy as np
import pandas as pd

y=np.arange(0,100,1)
y=pd.DataFrame(y)
x=y.shift(1)
x=pd.DataFrame(x,index=np.arange(0,1))
kf = KF(initial_state_mean=0,n_dim_obs=1)
#kf = kf.em(x.dropna().values,n_iter=5)
state_means,_ = kf.filter(x.dropna().values)
d={'a':np.asarray(x),'b':np.asarray(state_means)}
sm = pd.DataFrame(state_means,index=x.index[:-1],columns=['state'])
sma=x.rolling(window=10).mean()
x['kalman']=sm
x['rolling']=sma
x.plot(figsize=(10,8))

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...