Python PyKalman EM在平凡的模拟中不起作用

Python PyKalman EM在平凡的模拟中不起作用,python,kalman-filter,pykalman,Python,Kalman Filter,Pykalman,我正在尝试使用卡尔曼滤波器来估计参数,使用PyKalman,我对转移矩阵估计有问题。它总是返回1.0。请看这个简单的例子: from pykalman import KalmanFilter N = 1000 a = 0.05 sims = [] v = 1 for t in range(N): v *= a sims.append(v) kf = KalmanFilter(n_dim_obs=1, n_dim_state=1, em_

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

from pykalman import KalmanFilter

N = 1000
a = 0.05
sims = []

v = 1

for t in range(N):
    v *= a
    sims.append(v)

kf = KalmanFilter(n_dim_obs=1, n_dim_state=1,
                  em_vars=['transition_matrices'],
                  initial_state_mean=[1],
                  transition_covariance=[0.0],
                  transition_offsets=[0],
                  initial_state_covariance=[0.0],
                  observation_matrices=[1],
                  observation_covariance=[0],
                  observation_offsets=[0])

emres = kf.em(sims, n_iter=10)

print "alpha: {}".format(emres.transition_matrices[0, 0])


>>> alpha: 1.0

观测值与潜在状态变量相同,如观测矩阵所示,噪声协方差均为0。类似地,状态变量在每次迭代中简单地由alpha乘以,但alpha的模型适合1.0。这到底是怎么回事?在其他示例中,我能够拟合协方差,只有转换矩阵无法拟合。

查看代码,它看起来像是先过滤然后平滑数据,因此它将使用您给定的任何转换矩阵(如果未指定,则为1,如本例所示)。然后将EM算法应用于平滑数据。然后EM算法必须适合此转换矩阵,因为您的数据使用默认的转换矩阵。代码似乎不正确。因此,估计此参数需要一定量的噪波,现在开始工作。查看代码,它似乎首先过滤然后平滑数据,因此它将使用您给定的任何转换矩阵(如果未指定,则为1,如本例所示)。然后将EM算法应用于平滑数据。然后EM算法必须适合此转换矩阵,因为您的数据使用默认的转换矩阵。代码似乎不正确。因此,估计此参数需要一定量的噪声,目前正在工作。