【问题标题】:EM algo returns different answers using pykalmanEM 算法使用 pykalman 返回不同的答案
【发布时间】:2018-06-04 00:51:38
【问题描述】:

我在Python 3.6.3中使用pykalman 0.9.5时遇到了一个问题

参考下面的代码,为什么kf2kf3 的结果不同,而kf1kf3 的结果相同?

kf2kf3 的过程不同之处在于我只是将迭代拆分为运行kf2 的函数的2 次。

感谢大家的关注。

>>>pri_mean[:10]
array([ 2827.2222,  2829.6   ,  2831.    ,  2832.1   ,  2833.1   ,  2835.3   ,  2833.9   ,
        2833.8   ,  2833.6   ,  2833.    ])

>>>kf1 = KalmanFilter()
>>>kf1 = kf1.em(pri_mean, 10, em_vars='all')
>>>print(kf1.transition_matrices, kf1.transition_offsets, kf1.transition_covariance)
[[ 0.99741876]] [ 10.04426882] [[ 2896.92752373]]
>>>kf2 = kf1.em(pri_mean, 10, em_vars='all')
>>>print(kf2.transition_matrices, kf2.transition_offsets, kf2.transition_covariance)
[[ 0.99364606]] [ 20.02260806] [[ 2600.94151188]]

>>>kf3 = KalmanFilter()
>>>kf3 = kf3.em(pri_mean, 20, em_vars='all')
>>>print(kf3.transition_matrices, kf3.transition_offsets, kf3.transition_covariance)
[[ 0.99741876]] [ 10.04426882] [[ 2896.92752373]]

【问题讨论】:

    标签: python kalman-filter state-space expectation-maximization pykalman


    【解决方案1】:

    我编辑了答案,因为我误解了这个问题。我认为问题在于您缺少关键字n_iter

    查看此代码:

    kf1 = KalmanFilter()
    kf1 = kf1.em(pri_mean, n_iter=10, em_vars='all')
    print(kf1.transition_matrices, kf1.transition_offsets, kf1.transition_covariance)
    kf1 = kf1.em(pri_mean, n_iter=10, em_vars='all')
    print(kf1.transition_matrices, kf1.transition_offsets, kf1.transition_covariance)
    kf1 = KalmanFilter()
    kf1 = kf1.em(pri_mean, n_iter=20, em_vars='all')
    print(kf1.transition_matrices, kf1.transition_offsets, kf1.transition_covariance)
    

    我通过KalmanFilter() 创建一个过滤器,循环 10 次迭代并打印,然后再循环 10 次并打印。 这相当于直接调用.em() 20 次迭代。

    会产生以下输出

    [[ 0.95500561]] [ 113.29118228] [[ 6431.66262464]]
    [[ 0.93636512]] [ 119.32378005] [[ 249.67547612]]
    [[ 0.93636512]] [ 119.32378005] [[ 249.67547612]]
    

    【讨论】:

    • 您好,drublackberry,感谢您的回答。我故意覆盖了 kf1,因为我想比较 kf2,它像 kf3 一样总共迭代 20 次,而 kf3 本身,它在一个函数中迭代 20 次。两次调用 em(n_iter=10) 和调用一次 em(n_iter=20) 之间的结果是否应该相同?我很困惑。
    • 对不起@Gabriel_F 我误解了。我编辑了答案,所以现在应该可以了。
    • 原来如此!但是,我还是不明白。我误解了哪一部分?在我的示例中,与您的第一个“kf1”实例和第二个“kf1”实例相比,kf1 和 k3 不应相互影响。
    • 比这更简单,你忘了告诉你的电话 10 或 20 是n_iter。您的实例化序列应该可以正常工作。
    • 抱歉耽搁了。我刚试了一下,得到了我想要的,就像你说的那样。非常感谢。多么愚蠢的错误。
    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2015-06-30
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多