SARIMAX: инкрементальный фильтр Калмана - PullRequest
0 голосов
/ 10 апреля 2019

Не могли бы вы сообщить мне, возможно ли использовать текущий код SARIMAX statsmodels для постепенного применения фильтра Калмана (чтобы сделать его быстрее)?

Вот что я имею в виду. Представьте, что вы подходите модели SARIMAX (# 1), используя данные с индексами в [iFitBegin, iFitEnd], затем вы хотите использовать такую ​​модель, чтобы делать прогнозы для данных с индексами в [iFitEnd+1, iDataEnd]. Похоже, что для этого в текущем коде необходимо создать новую модель SARIMAX (# 2) с использованием данных с индексами в [iFitBegin, iDataEnd] и применить фильтр Калмана к модели # 2 с параметрами, взятыми из модели # 1. После этого можно запросить прогнозы у модели № 2. Однако в вычислительном отношении это дорого делать (для больших моделей), если предсказания выполняются для потоковых данных (, когда новые данные поступают по одной точке данных за раз ), поскольку каждый раз приходится возвращать всю фильтрацию Калмана из iFitBegin к индексу iPred (тот, по которому требуется прогноз). Математически фильтр Калмана применяется постепенно, т. Е. Если фильтрация Калмана выполняется до индекса iPred, то для фильтрации до индекса iPred+1 нужно просто принять состояние на iPred и применить только один шаг фильтра Калмана используя одну новую точку данных в iPred+1, и поэтому было бы здорово, если бы можно было делать это и в коде постепенно.

Не могли бы вы сообщить мне, если в текущей реализации statsmodels SARIMAX есть способ сделать такую ​​инкрементную фильтрацию Калмана (т.е. одно обновление состояния за раз)?

1 Ответ

0 голосов
/ 11 июля 2019

Это теперь доступно в версии разработки Statsmodels (то есть в основной ветке Github) и будет доступно в версии 0.11 (пока нет графика времени для этого выпуска).

В принципе, вы сможете сделать следующее:

training_mod = sm.tsa.SARIMAX(training_endog, order=(1, 0, 0))
training_res = training_mod.fit()

# The `extend` call will only apply the Kalman filter to the
# updated_endog
extended_res = training_res.extend(updated_endog)
fcasts = extended_res.forecast()

Обратите внимание, что это не переоценки параметров, но это позволит вам расширить текущие результаты, чтобы приспособить обновленный набор наблюдений без необходимости повторного запуска фильтра Калмана над training_endog образец.

См. https://www.statsmodels.org/devel/examples/notebooks/generated/statespace_forecasting.html для некоторых дополнительных деталей.

...