Дает ли Фильтр Калмана, использующий 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,100,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 просто заполнит этот промежуток и в конечном итоге совпадет с прямой линией, но через некоторое время они кажутся параллельными.

Это правильно или я что-то не так делаю?


person Zuj3brusu    schedule 25.01.2021    source источник
comment
я изменил ваш код:colab.research.google.com/drive/ проверить это   -  person bakaDev    schedule 25.01.2021
comment
@bakaDev Ваша записная книжка закрыта   -  person Zuj3brusu    schedule 25.01.2021


Ответы (1)


Вот код, которым я поделился в комментариях.

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,100,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))

введите здесь описание изображения

person bakaDev    schedule 26.01.2021
comment
Но ваш код доказывает, что строка kalmanFilter в конечном итоге должна совпадать с данными, и, следовательно, это доказывает, что мой код тоже неверен. - person Zuj3brusu; 26.01.2021
comment
Привет. Я добавил код в твою записную книжку. Не могли бы вы проверить, если это неправильно? - person Zuj3brusu; 26.01.2021
comment
Вы можете поделиться своим блокнотом, потому что мой блокнот имеет разрешение только на ручной просмотр, и в результате ваш блокнот является копией. - person bakaDev; 26.01.2021
comment
Итак, я действительно смог понять, что происходит, взглянув на исходный код pykalman. Добавление transition_matrices и transition_covariance вызывало проблему, потому что нам не нужно, чтобы состояния зависели от предыдущего состояния; просто новое наблюдение. После этого он работал нормально. На самом деле я хотел использовать его, чтобы найти наклон регрессии между двумя данными, и я смог использовать pykalman, и я также написал базовый код, используя теорию фильтра Калмана, и оба дают одинаковые ответы. - person Zuj3brusu; 26.01.2021