Местный пляж находится недалеко от того места, где я живу, поэтому иногда хожу туда, чтобы насладиться уединением. В этот день я медитировал над своей завтрашней лекцией по Фильтру Калмана. «Это может быть сложной задачей для некоторых студентов», - сказал я сам себе. Я сижу на большом камне, чувствую легкий ветерок и пропитываюсь теплым закатом. Я наблюдал, как чайки летят над величественным закатом, отбрасывая нечеткие отражения на сверкающий океан. Внезапно у меня случается неописуемый радостный момент - линия летящей чайки в небе и нечеткие отражения в океане - прекрасная аналогия с фильтром Калмана. Я крикнул чайкам «А-ха», и они ответили мне «А-ха-А-ха-А-ха».

Если вы впервые слышите фильтр Калмана, возможно, вы не знаете, что многие устройства в нашей жизни полагались на него. Фильтр Калмана оценивает траекторию движущегося объекта. На вашем iPhone или телефоне Android есть картографическое приложение, которое определяет местоположение телефона и расстояние до него. Автомобили, грузовые автомобили, корабли, самолеты или дроны оснащены GPS (глобальной системой позиционирования) для более точного отслеживания движения. Известным ранним применением был навигационный компьютер Apollo, который доставил Нила Армстронга на Луну и, что наиболее важно, вернул его. Фильтр Калмана также широко применяется для обнаружения аномалий временных рядов. С появлением компьютерного зрения для обнаружения движущихся объектов, таких как автомобили или бейсбольные кривые, модель фильтра Калмана станет еще более важной.

В этой статье я начну с основной концепции, затем с алгоритма и кода Python. Я покажу вам три случая. Первый - это его применение в моделировании цен на акции, а второй и третий объясняют его применение для движущегося объекта. Записная книжка Python доступна на этом гитхабе.

История летающей чайки

Представьте, что вы устремили взгляд на сверкающие отражения, обозначенные как Yt в начале статьи. Вы знаете, что это происходит по линии полета чайки в небе Xt, но вы не можете одновременно наблюдать Xt. Между тем из-за волн океана проецируемый Yt становится очень шумным.

В этой истории отражены несколько характерных свойств фильтра Калмана: (1) местоположение Xt летающей чайки зависит от предыдущего местоположения в t-1. Xt называется состоянием в момент времени t и не наблюдается. (2) наблюдаемое Yt происходит из ненаблюдаемого Xt с гауссовскими шумами. Фильтр Калмана может восстановить «истинное состояние» Xt, учитывая последовательность зашумленных Yt.

Позвольте представить модель в ее математической форме. Я буду использовать простейшую форму фильтра Калмана, в которой есть один термин Xt-1 и термин ошибки. Местоположение летающей чайки в момент времени t равно Xt, которое зависит от предыдущего местоположения Xt-1, умноженного на матрицу перехода В плюс случайный гауссов шум qt.

Матрица перехода сообщает нам, как местоположение изменяется от предыдущего состояния к текущему состоянию. Матрица перехода меняется со временем и не является постоянной. В этом простом одночленном уравнении матрица перехода представляет собой просто числовое значение. Примем по-прежнему условные обозначения как матрицу. Письмо в статье Я введу больше членов в уравнение, тогда вы увидите, что это матрица. Член ошибки qt имеет свою ковариационную матрицу Qt. Ковариационная матрица - это квадратная матрица, дающая ковариацию между каждой парой элементов данного случайного вектора. В этом простом одночленном уравнении случайный вектор имеет только один элемент, а ковариация - только одно значение.

Теперь позвольте мне представить второе уравнение. Местоположение отражения - Yt. Это состояние Xt, умноженное на матрицу наблюдения C t на белый шум rt. Матрица наблюдения сообщает нам следующее наблюдение (или так называемое измерение), которого мы должны ожидать с учетом прогнозируемого состояния Xt. Ковариационная матрица ошибки r t равна Rt. Опять же, в этом случае с одной мерой ковариация - это одно значение.

Как фильтр Калмана работает с GPS?

GPS - это система из 30+ навигационных спутников, вращающихся вокруг Земли. Они постоянно посылают сигналы. Эти сигналы принимает GPS-приемник в вашем телефоне. Приемник рассчитывает расстояние от четырех или более спутников GPS, чтобы определить ваше местоположение.

Но сигналы, идущие по небу к вашему приемнику, не без ошибок. Нечеткая синяя линия на следующем изображении, вероятно, соответствует тому, что получает ваш GPS-приемник, гладкая оранжевая линия - это то, что вы видите в своем приложении. Алгоритм фильтра Калмана «отфильтровывает» грубую синюю линию, чтобы получить оранжевую линию.

Как эти два уравнения применимы к этой истории? В уравнении (1) местоположение автомобиля - Xt, которое переходит от предыдущего местоположения Xt-1 с помощью матрицы перехода At, плюс несколько белых ошибок. В GPS тоже есть ошибка измерения. В уравнении (2) Yt - это наблюдаемое местоположение в моем приемнике GPS. Он проецируется от истинного местоположения Xt через матрицу наблюдений Ct, плюс ошибки измерения спутника-GPS qt. Приемник GPS в моем телефоне применяет фильтр Калмана, чтобы получить Xt из наблюдаемого Yt.

Зачем нужно слово «фильтр»?

Шумный временной ряд похож на временной ряд с множеством шероховатостей. Фильтр Калмана оценивает основные состояния. Он «фильтрует» грубые края, чтобы выявить относительно гладкие узоры. (Это не имеет ничего общего с вашим кофейным фильтром, смеется). Фильтр назван в честь Рудольфа (Руди) Э. Кальмана, который является одним из основных разработчиков его теории.

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

Ключевые свойства фильтра Калмана

Позвольте мне резюмировать здесь некоторые ключевые свойства:

  • Фильтр Калмана называется оптимальной оценкой. Оптимальный в каком смысле? Фильтр Калмана минимизирует среднеквадратичную ошибку оцениваемых параметров. Так что это лучший объективный оценщик.
  • Это рекурсивный, поэтому Xt + 1 можно вычислить только с помощью Xt. и не требует наличия всех прошлых точек данных X0, X1,…, Xt. Это важное преимущество для обработки в реальном времени.
  • Члены ошибки в уравнениях (1) и (2) оба являются гауссовыми распределениями, поэтому член ошибки в предсказанных значениях также следует гауссовскому распределению.
  • Нет необходимости предоставлять помеченные целевые данные для «обучения» модели.

Как работает алгоритм?

Позвольте мне разбить математические операции фильтра Калмана на этапы.

  1. Получить значение начального состояния X0. Поскольку мы ничего об этом не знаем, мы просто предоставляем любое значение для X0. Вы увидите, как фильтр Калмана сходится к истинному значению. Получите начальные значения для матрицы перехода A0, операционной матрицы C0 и ковариационной матрицы ошибки Wt и Vt .
  2. Прогноз: фильтр Калмана оценивает текущее состояние Xt, используя матрицу перехода At для временного шага t.
  3. Обновление. Фильтр Калмана получает новое наблюдение Yt в качестве новых входных данных. Затем он оценивает ковариационную матрицу Qt и Rt для временного шага t.
  4. Повторите шаги (2) и (3) для следующего временного шага. На каждом шаге ему нужна только статистика за предыдущий раз t-1, но не вся история.

Случай 1. Фильтр Калмана для прогноза курса акций

Движение цен на акции часто моделируется как случайное блуждание. Это означает, что в каждый момент времени серия просто отходит на случайный шаг от своей последней позиции с шагами, при которых среднее значение равно нулю. Это описано в уравнении (1): Xt = At ​​* Xt-1. когда At = 1. Это также называется случайным блужданием без смещения. (Для справки: если средний размер шага имеет ненулевое значение α, он называется случайным блужданием с дрейфом. Он становится Xt = At ​​* Xt-1 + α .) Ниже давайте загрузим S & P500 через yfinance API.

Фильтр Калмана реализовать просто. Уравнение (1) имеет только один член Xt-1. Таким образом, матрица перехода At имеет только одно значение [1.0]. Это 1.0 из-за предположения о случайном блуждании. Мы также позволяем ему иметь небольшую турбулентность 0,01, что означает, что At иногда может подниматься выше 1,0, а иногда опускаться ниже 1,0. Обозначается transition_covariance=0.01. Матрица наблюдения Ct также равна 1,0.

Как насчет начального значения X0? Вы можете ввести любое значение (предположим, что мы ничего не знаем о S & P500). Позже вы увидите, как оно быстро сводится к истинному значению. Члены ошибки qt и rt распределены по Гауссу со средним значением 0 и дисперсией 1,0. Итак, initial_state_covariance=1 и observation_covariance=1.

Мы сохраняем оценки фильтра Калмана в столбце «KF_mean». Вы видите, что первые несколько оценок далеки от целевого значения «Скор. Закрытие»? Однако он сходится к цели «Adj Close» после первых нескольких наблюдений, как показано на графике ниже.

Вы заметили, что мы не настраиваем обучающий набор данных для обучения модели? Это правильно. Фильтр Калмана так не работает. Цель обучения модели - получить параметры At. Фильтр Калмана получает значение параметра для каждого нового временного шага t.

Случай 2.1. Фильтр Калмана для движущегося объекта

Движущийся объект, такой как мяч или автомобиль, обычно управляется силой, поэтому со временем изменяется не только его положение, но и его скорость. Теперь вектор состояния Xt может иметь два элемента: положение и скорость, и оба они не наблюдаются. Я включил этот случай 2.1, чтобы показать вам, как настроить матрицы перехода и наблюдения, когда Xt является вектором.

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

Теперь вектор состояния Xt имеет два элемента «позиция» и «скорость», то есть Xt = [xt, vt]. Согласно физике, новое местоположение - это предыдущее местоположение плюс время умножения скорости: xt = xt-1 + v⋅t. Мы предполагаем, что скорость в основном не меняется, хотя есть небольшая турбулентность, поэтому vt = vt-1. Уравнение (1) принимает матричную форму:

Таким образом, матрица перехода At равна [[1, t], [0,1]], где t = 1 в нашем случае. Мы допускаем небольшую турбулентность для At, поэтому ковариация перехода transition_covariance создает небольшую турбулентность.

Давайте построим наблюдаемый Yt и оценки фильтра Калмана для xt и vt. Вы будете поражены тем, как фильтр Калмана восстанавливает xt до волна совершенного греха, если в уравнении предполагается vt.

Случай 2.2. Фильтр Калмана для движущегося объекта

Что, если матрица перехода в случае 2.1 настроена как один элемент? Это означает, что в Xt нет члена скорости. Фильтр Калмана оценивает позиции. По сути, он выполняет свою работу, но зигзагообразные оценки гораздо менее точны, чем синусоидальная волна.

Другие интересные ресурсы

Этот сайт имитирует фильтр Калмана. Перемещайте указатель мыши по экрану. Посмотрите, как фильтр Калмана снижает входной шум и предсказывает ваше движение.

Для получения прогнозов я рекомендую статью Понимание основ фильтра Калмана с помощью простого и интуитивно понятного вывода », опубликованную в журнале IEEE Signal Processing Magazine Vol. 29, 2012)

Заключение

Спасибо за чтение. Надеюсь, это помогло вам лучше понять тему. Не забудьте загрузить блокнот Jupyter через этот гитхаб.

Я должен поблагодарить пляж и океан, которые вдохновляют меня. Я смотрю, как океанские волны приходят и уходят, оставляя полосу мокрого песка. Это побудило меня написать предыдущую статью Обнаружение аномалий для временных рядов. Читателям, интересующимся обнаружением аномалий временных рядов, может быть полезна эта серия статей.