Вектор состояния фильтр калмана

А ваш фильтр Калмана правильно работает?

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

В открытых источниках можно встретить множество работ, статей и книг по тому, как работает этот загадочный фильтр, будь то линейный, расширенный (extended), сигма-точечный (unscented) или любой другой фильтр Калмана. Однако, вопрос корректности работы фильтра освещается намного реже.

В это же время фильтр Калмана применяется в системах с особыми требованиями к функциональной безопасности, отказ или неисправность которых может привести, в том числе, к летальным исходам, как это имеет место в случае автопилотируемых устройств. Таким образом, валидация результатов работы фильтра Калмана – это один из первостепенных вопросов, который должен стоять перед инженером при разработке ПО для подобных систем.

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

Фильтр Калмана

Рис. 1. Измерения, предсказываемое и оптимальное состояние.

Я предполагаю, что читатель знаком с базовыми принципами работы фильтра Калмана, поэтому лишь коротко объясню его суть. Для тех, кто не знаком, советую прочитать эту или Рис. 1. Измерения, предсказываемое и оптимальное состояние.

Для описания какого-либо процесса мы используем как состояние, полученное посредством измерений (Measurement), так и состояние, полученное по уравнениям, описывающим происходящий процесс (Predicted state estimate). Комбинируя эти два независимых состояния, мы получаем более точное оптимальное состояние (Optimal state estimate).

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

В зависимости от сложности процесса и измерений можно использовать линейный, расширенный или сигма-точечный фильтр Калмана.

Проблема верификации результатов

Рис. 2. Пример сравнения зашумленных, оценочных и реальных данных.

Фильтры Калмана используются в том случае, если мы имеем зашумленные измерения, а уравнения, описывающие динамику системы, известны лишь приблизительно. Алгоритмы, использующие фильтры Калмана, относятся к более общему классу оценочных алгоритмов, которые помимо состояния также оценивают возможную ошибку (с помощью Рис. 2. Пример сравнения зашумленных, оценочных и реальных данных.

Проиллюстрируем проблему на простом примере, когда состояние системы описывается одной переменной x. В таком случае, ковариационная матрица ошибок представляет из себя дисперсию σx 2 этой величины. Допустим, у нас x = 0 и σx = 1, тогда в соответствии с правилом 3 сигма, мы можем с уверенностью > 99.5 % сказать, что наша величина лежит в интервале [-3, 3]. Если мы увеличим среднеквадратичное отклонение σx до 10, то интервал увеличится до [-30, 30]. Если наш фильтр дает оценку x = 0 и σx = 1, в то время как действительная величина среднеквадратичного отклонения σx = 10, то наш объект может в реальности оказаться в местоположении, которое практически невозможно в соответствии с оценкой нашего фильтра. Чем это может грозить, думаю понятно без комментариев. Таким образом, дисперсия вносит существенный вклад в оценку состояния, и пренебрегать ей ни в коем случае нельзя.

С другой стороны, так как фильтр работает со случайными данными, то вполне возможно, что для какого-то набора данных даже некорректный фильтр выдаст правдоподобные результаты, поэтому делать выводы о том, как работает фильтр, по одному запуску было бы неверно. Кроме того, возникает вопрос: как убедиться, что значения дисперсии, рассчитанные по алгоритму, близки к реальным данным?

Терминология и обозначения

Прежде чем пойти дальше, введем основные обозначения и терминологию. Подстрочный индекс k будет обозначать номер временного слоя, xk – вектор состояния системы, yk – вектор измерений, Pk – ковариационная матрица ошибок, x, P – начальные значения вектора состояния и ковариационной матрицы. Динамика системы описывается дискретными уравнениями:

где f – функция перехода для рассматриваемого процесса, wk – некоторая матрица шумов, ассоциированная с соответствующей функцией перехода. Функция f может иметь различный вид, например, в простейшем случае быть линейной как относительно xk-1, так и относительно wk.

Связь между измерениями системы и вектором состояния описываются уравнением:

где h – функция, связывающая вектор состояния с вектором измерений, а vk – некоторая матрица ошибок измерений.

Стоит отметить, что в общем случае размерности вектора измерений и вектора состояния различны. Например, состояние может в себя включать вектор положения и вектор скорости – итого 6 компонент, а измерения – только вектор положения, а значит, всего три компоненты.

Реальные значения вектора состояния и ковариационной матрицы мы будем обозначать xk * и Pk * , в то время как значения, полученные с помощью фильтра Калмана, – просто xk и Pk.

Постановка численного эксперимента

Для валидации фильтра Калмана мы будем использовать метод Монте-Карло. Вначале мы вычислим реальные значения состояния xk * на каждом временном слое от 0 до n. Для практических целей это можно сделать с помощью уравнения (1), заменив wk на нулевую матрицу и задав определенные x * , P * .

Затем нам нужно смоделировать m независимых численных экспериментов. Всего у нас имеется 3 источника случайности, которые мы будем варьировать за каждый проход итерации Монте-Карло, – это начальное состояние (его мы знаем только с точностью, определяемой ковариационной матрицей P), и значения шумов, определяемые матрицами wk и vk. Таким образом, на каждом прогоне мы получаем различные значения начального состояния и значений шумов процесса и измерений на каждом временном слое. Номер итерации Монте-Карло мы будем обозначать буквой i. В результате моделирования мы будем иметь m произвольных наборов xk i и Pk i для 0 ≤ kn и 0 ≤ im.

Стоит заметить, что обычно при постановке задачи значения Pk * не известны, однако их можно заменить на статистические значения, вычисленные по формуле:

где надстрочный индекс T – обозначает транспонирование. В дальнейшем везде под Pk * имеется в виду Pk est .

Верификация результатов

Стороннему наблюдателю может показаться, что мы ничего существенного не сделали, но, на самом деле, самое сложное уже позади. Осталось только понять, насколько близки значения xk i и Pk i к ожидаемым значениям xk * и Pk * . Для этого мы воспользуемся идеей из статьи [

Данная формула определяет некоторую ошибку как в случае несоответствия xk i , так и в случае несоответствия Pk i , и обладает следующими полезными свойствами:

Значение γk i близко к нулю, если xk i и Pk i близки к действительным значениям;

Значение γk i безразмерно и, следовательно, не зависит от единиц измерения xk i ;

Значение γk i одинаково серьезно штрафует как за оптимистичные (отношение [xk i, err Pk i xk i, err ] / [xk i, err Pk * xk i, err ] > 1) значения, так и за пессимистичные значения Pk i (когда это отношение меньше единицы).

Тогда для временного слоя k можно посчитать среднее значение noncredibility index’а:

Это и есть основная мера валидности результата, полученного с помощью фильтра Калмана. Таким образом, для каждого временного слоя мы можем посчитать γk avg и по нему понять, насколько хорошо работает наш фильтр. В процитированной работе было показано, что значения γk avg

1 соответствуют достоверным результатам.

Собирая все в одну кучу

Весь процесс валидации фильтра Калмана сводится к следующим шагам:

Для поставленной задачи задаем функцию перехода f, функцию, связывающую вектор состояния с вектором измерений, h, матрицы шумов wk и vk и начальные значения x * , P * ;

Проводим симуляцию без шумов для получения действительных значений xk * ;

Запускаем m итераций Монте-Карло и получаем xk i и Pk i для каждого временного слоя k и для каждой итерации i;

Вычисляем Pk est в соответствии с формулой (5). Pk est будет служить в качестве Pk * ;

Для каждого временного слоя вычисляем γk avg , которая и будет показателем достоверности результатов;

(Опционально) Строим график зависимости γk avg от времени и смотрим, как изменялось качество работы фильтра.

Результаты

Рис. 3. Кинематическая модель мотоцикла

В качестве примера рассмотрим задачу отслеживания мотоцикла (рис. 3) из Рис. 3. Кинематическая модель мотоцикла

Уравнения, описывающие кинематическую модель движения, запишутся в виде:

где x, y – координаты центра тяжести, v – скорость, ψ – угол между направлением мотоцикла и осью x, β – угол между направлением скорости и направлением мотоцикла, a – ускорение, lr и lf – длина от центра масс до задней и передней части соответственно, δf – угол между направлением переднего колеса и направлением мотоцикла.

Значения lr и lf являются входными параметрами конфигурации мотоцикла, δf и a – значения, которые определяют динамику системы, а x, y – вектор состояния.

Из вида уравнений видно, что они имеют нелинейный вид, а следовательно, нужно применять либо расширенный, либо сигма-точечный фильтр Калмана.

Ради теста фильтров и для усложнения задачи с вычислительной точки зрения, будем считать, что измерения производятся в полярных координатах:

Измерения в полярных координатах вносят существенные нелинейности в расчеты и являются неплохой проверкой работы фильтра.

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

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

Рис. 4. Зависимость noncredibility index от номера итерации для чисел одинарной точности.

Рис. 4. Зависимость noncredibility index от номера итерации для чисел одинарной точности.

Как видно, значение noncredibility index растет с течением времени, что говорит о накапливаемой ошибке в результатах и, по-видимому, все большему удалению матрицы Pk от действительного значения.

Для чисел двойной точности значения γk avg от номера итерации колебались в пределах от 0.8 до 1.6, что говорит о правдоподобности результатов (см. рис. 5). Как видно из рисунка, значения noncredibility index не растут с течением времени, а лишь колеблются в окрестности некоторого среднего значения.

Рис. 5. Зависимость noncredibility index от номера итерации для чисел двойной точности.

Рис. 5. Зависимость noncredibility index от номера итерации для чисел двойной точности.

Вывод

В статье была разобрана достаточно простая задача, однако предложенный подход валидации легко обобщить как для более сложных постановок задач, так и для более комплексных подходов проведения численного эксперимента.

При применении рассмотренной выше схемы валидации для ряда более сложных задач мы установили, что расширенный фильтр дает неудовлетворительные результаты, которые было бы невозможно определить «на глаз» простым сравнением графиков векторов состояния. Таким образом, для дальнейшего моделирования мы использовали сигма-точечный фильтр.

Лично меня подкупила простота подхода – какова бы ни была задача: со сложными дифференциальными уравнениями, описывающими процесс, и большим вектором состояния, или простыми алгебраическими уравнениями и скалярным состоянием, в итоге мы получаем лишь одно число, которое наглядно показывает, насколько хорошо фильтр описывает происходящий процесс. Другой плюс рассмотренного подхода – это возможность валидации не только вектора состояния xk i , но и ковариационной матрицы ошибок Pk i .

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

Источник



Векторный фильтр Калмана

На предыдущем занятии мы увидели как можно применить фильтр Калмана для построения оценок координаты x при перемещении мальчика. Он выглядел так:

Но, если рассмотреть более общую задачу и попытаться построить оценки сразу по трем пространственным осям, то в самом простом случае можно выполнить три таких процедуры независимо по каждой оси:

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

или, в таких очевидных обозначениях:

Здесь и далее будем полагать, что все случайные составляющие подчиняются нормальному закону распределения с нулевым средним и некоторыми дисперсиями. Например, для

Модель наблюдений, соответственно, определим вектором z:

или, в векторном виде:

Здесь также дисперсии шумов, будут образовывать диагональную матрицу:

Читайте также:  Фильтр гидравлический 60C0016 впускной на XG955III

Таким образом, у нас есть векторная марковская модель изменения объекта в пространстве и вектор наблюдений текущего местоположения объекта:

Когда на вход приемника приходит самое первое наблюдение, то лучшая оценка – это значение самого наблюдения:

с дисперсией ошибок оценивания:

В следующий момент времени самолет немного меняет свое местоположение и на вход GPS-приемника приходит очередное наблюдение:

Как в этой ситуации нам построить оценку текущего местоположения? Одно наблюдение у нас есть – это вектор . Второе можно взять как прогноз текущего положения из предыдущей оценки , используя марковскую модель движения:

Я не буду здесь приводить доказательство оптимальности этого прогноза, вывод делается аналогично одномерному случаю, о котором мы говорили на предыдущем занятии.

Теперь, нам нужно вычислить дисперсию ошибок прогноза, которая равна:

В результате, мы имеем все необходимые данные для построения оценок координат на текущем шаге с помощью векторного фильтра Калмана. Используя формулы скалярного фильтра:

Обобщим их для векторно-матричного случая:

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

Итак, на втором шаге, имеем следующие вычисления:

Ну а все последующие положения рекуррентно вычисляются по этим же самым формулам.

Давайте реализуем векторный фильтр Калмана на Python и посмотрим на результаты его работы.

Фактически, при условии некоррелированности шумов и независимости перемещений по каждой из координат, мы получили три независимых канала оценивания параметров x, y, z:

Однако, если модифицировать нашу модель и учесть в ней скорости движения объекта по каждой из координат:

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

Далее, для нашего второго варианта матрицы дисперсий порождающего шума и шума наблюдений, будут выглядеть так:

А весь остальной алгоритм оценивания будет прежним:

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

Источник

Вектор состояния фильтр калмана

4) вычисление ковариационной матрицы ошибки оценки

Свойства фильтра Калмана

Суммируем основные свойства фильтра Калмана.

1) Так же как для рекуррентного метода наименьших квадратов, можно показать, что

то есть добавление новой информации, содержащейся в наблюдении y(t+1) может только уменьшить неопределенность в определении состояния.

2) Если векторные случайные последовательности u(t) и v(t) распределены по нормальному закону, то фильтр Калмана дает оптимальные оценки вектора состояний. При этом

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

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

4) В процессе вычисления оценок автоматически вычисляются характеристики точности этих оценок — матрицы ковариаций ошибок, диагональные элементы которых — дисперсии ошибок оценок компонент вектора состояний.

5) Рекуррентный метод наименьших квадратов, очевидно, является частным случаем фильтра Калмана, поскольку уравнения рекуррентного МНК совпадают с уравнениями фильтра Калмана для статической модели

Контроль расходимости фильтра Калмана

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

Уравнение для ошибки имеет вид

Поскольку , ковариационная матрица ошибки равна

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

1) ошибки в моделировании динамики процесса — нарушение гипотезы линейности, не точный выбор матриц A, B, H;

2) некорректное задание ковариационных матриц шумов, V слишком мала;

3) некорректное задание начального значения — матрица P(0) слишком мала.

Обобщение на нестационарный случай

До сих пор мы предполагали, что матрицы A,B,H,V не зависят от времени, то есть рассматривали стационарные процессы (системы). Фильтр Калмана легко обобщить на случай нестационарных не полностью наблюдаемых процессов (систем), уравнения которых имеют вид

где ковариации шумов V(t) также зависят от времени. Для этого в уравнениях фильтра Калмана ( 6.44 ) — ( 6.48 ) достаточно указать явную зависимость матриц от времени.

Оценивание регрессии с изменяющимися параметрами

Фильтр Калмана можно использовать для оценивания модели множественной линейной регрессии с изменяющимися параметрами (см. пример 6.6, п. 6.5 ). В этом случае A = I, вектор параметров играет роль вектора состояний, а вектор шумов u моделирует возможные флуктуации параметров. Матрица H формируется из регрессоров, наблюдаемых до момента t — 1. Этот подход особенно эффективен, если имеется информация о степени возможных изменений параметров, которая позволяет задать матрицу ковариаций шумов u. Данный подход можно использовать как альтернативу рекуррентному МНК с забыванием. Его преимущество состоит в том, что выбор матрицы ковариаций вектора шумов дает больше возможностей для учета изменений параметров. Например, можно принять во внимание тот факт, что часть компонент вектора параметров постоянны (в матрице ковариаций им будут соответствовать нулевые диагональные элементы — дисперсии).

Наилучший в смысле минимума суммарной дисперсии ошибки прогноз вектора состояния на один шаг — это оценка вектора x(t + 1) по наблюдениям y(0), y(1), …, y(t), которая дается формулой

Ковариационная матрица ошибки прогноза на один шаг определяется уравнением ( 6.45 ).

Наилучший прогноз вектора x на шагов вперед относительно текущего момента времени t по наблюдениям вектора y до момента t включительно определяется по формуле

Получим уравнение для ковариационной матрицы ошибки прогноза на шагов

Прежде всего, выразим вектор состояния через x(t). Используя уравнение ( 6.29 ), запишем

Источник

Фильтр Калмана: алгоритм, позволяющий понять слияние сенсора

Вы едете на своей машине через туннель. Сигнал GPS пропал. Тем не менее, вы можете получить уведомление о том, что вам следует съездить в туннель. Как мы должны ориентироваться на автомобиле внутри туннеля, который должен знать, где он находится сейчас, учитывая только последнюю позицию?

Краткое примечание по датчикам

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

Подход, который объединяет датчики транспортного средства, может рассчитать положение.

Измерение от датчиков

Предположим, что мы были на въезде в туннель и ехали со скоростью 50 км / ч, тогда навигация действительно может быть рассчитана точно там, где (x = позиция) мы были бы на 1 минуту (t = время) спустя.

Оба датчика имеют случайные ошибки, тракт передачи имеет помехи, и разрешение шины CAN или аналого-цифровых преобразователей может вызвать много неточностей в простом выражении «скорость».

Например, сигнал скорости выглядит так:

В среднем, измеренная скорость имеет некоторый «шум», добавленный к этому, который отличает их от основной истины. Если вычислить гистограмму определенных скоростей, можно увидеть, что определенные значения приблизительно подчинены нормальному распределению.

Таким образом, есть одно, и действительно только одно, максимальное значение (унимодальное) и спред (дисперсия). Если это так, тем не менее, мы можем сделать расчет очень хорошо с помощью хитрости.

Идея фильтра Калмана в одном измерении

Я хотел бы сначала объяснить идею фильтра Калмана (в соответствии сРудольф Эмиль Калман) только с одним измерением. Следующее объяснение заимствовано из Udacity CS373курспоПрофессор Себастьян Трун,

Расчетный шум помогает

Чтобы выполнить расчет оптимально, несмотря на шум измерений,«как сильно»Параметр должен быть известен. Это «как сильно»выражается с дисперсией нормального распределения. Это определяется один раз для используемого датчика, а затем использует только эту «неопределенность» для расчета.

В дальнейшем он больше не рассчитывается с абсолютными значениями, а со средними значениями (μ) и отклонениями σ ² нормального распределения. Среднее значение нормального распределения — это значение, которое мы хотели бы рассчитать. Дисперсия указывает на уровень достоверности. Чем уже нормальное распределение (низкая дисперсия), тем увереннее датчики в измерениях.

Датчик, который измеряет 100% точно, имеет дисперсию σ ² = 0 (он не существует).

Давайте предположим, что сигнал GPS был только что потерян, и навигационная система совершенно неясно, где вы находитесь. Дисперсия высокая, соответствующая кривая действительно плоская. Существует неопределенность.

Нормальное распределение с дисперсией = 20 и средним = 0

Теперь идет измерение скорости от датчика, который также является «неточным» с соответствующей дисперсией. Эти две неопределенности теперь должны быть связаны друг с другом. С помощью правила Байеса выполняется сложение двух гауссовских функций. Профессор Трун объясняет это очень четко вКурс Udacity CS373,

Две части информации (одна для текущей позиции и одна для погрешности измерения датчика) на самом деле дают лучший результат! Чем уже нормальное распределение, тем увереннее результат. Движение ухудшает оценку.

Конечно, транспортное средство также движется, что отрицательно влияет на точность определения местоположения. Датчик, например, может определять вращение колеса и делать предположения о радиусе колеса и может иметь заключение о пройденном расстоянии, но это всегда будет оставаться несколько неточным. Эта неточность движения также описана с нормальным распределением. Вычисления с текущей оценкой в ​​этот раз идут немного иначе, потому что «движение» также можно назвать «прогнозированием». Вы можете оценить после расчета, где вы будете в следующий (измерение) время.

В нашем примере μ просто v * dt, это расстояние, которое мы прошли за время расчета.

Простая реализация этого:

Измерение и обновление: фильтр Калмана

Фильтр Калмана просто вычисляет эти две функции снова и снова

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

Поскольку измеренные значения (в обновлении) относительно хорошо соответствуют прогнозируемым значениям (по прогнозам), фильтр улучшает шаг за шагом, чтобы гарантировать его правильность (нормальные распределения становятся уже и выше), даже если значения шумный.

Без матриц вы можете рассчитывать только в одном измерении, что недостаточно для .

Многомерный фильтр Калмана

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

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

Читайте также:  Группа команд сортировка и фильтр

Начальные условия / инициализация

Состояние системы X

В начале нам придется инициализировать с начальным состоянием. В одномерном случае состояние было вектором.

Если ничего не известно, вы можете просто ввести ноль здесь. Если некоторые граничные условия уже известны, они могут быть переданы в фильтр. Выбор следующей ковариационной матрицы определяет, насколько быстро фильтр сходится к правильным (измеренным) значениям.

Ковариационная матрица P

Неопределенность должна быть дана для начального состояния. В одномерном случае дисперсия была вектором, но теперь является матрицей неопределенности для всех состояний. Вот пример со всеми четырьмя штатами.

Эта матрица, скорее всего, будет изменена во время проходов фильтра. Это изменяется как в предсказании, так и в правильных шагах. Матрицы могут быть инициализированы на основе точности датчика. Если датчик очень точный, здесь следует использовать небольшие значения. Если датчик является относительно неточным, здесь следует использовать большие значения, чтобы позволить фильтру сравнительно быстро сходиться. Если датчик очень точный, здесь следует использовать небольшие значения.

Динамическая матрица А

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

Здесь указывается, «где» вектор состояния перемещается от одного шага вычисления к следующему в пределах. Эта динамическая модель в нашем случае является моделью «с постоянной скоростью», поскольку она предполагает, что скорость остается постоянной на этапе вычисления фильтра (дт).

Это просто отражает физические отношения для равномерного движения. Более высокой формой была бы модель постоянного ускорения, которая была бы 6-D фильтром и все еще включала бы ускорения в векторе состояния. В принципе, другая динамика может быть указана здесь.

Матрица дисперсии шума процесса Q

Поскольку движение транспортного средства (в смысле наложенного, нормально распределенного шума) также может быть нарушено, именно здесь вводится матрица ковариации шума процесса. Эта матрица рассказывает нам о фильтре и о том, как состояние системы может «перепрыгивать» с одного шага на другой. Представьте себе автомобиль, который едет автономно. Это может быть нарушено порывом ветра или дорожными ударами, что имеет эффект силы. Изменение скорости водителем также является ускорением, которое действует на транспортное средство. Если ускорение теперь влияет на состояние системы, то физическая зависимость для него равна Q. Матрица представляет собой ковариационную матрицу, содержащую следующие элементы:

Это легко вычислить, поместив вектор и умножив его на предполагаемое стандартное отклонение для ускорения.

Управляющая матрица B и управляющий вход u

Внешние переменные управления (например, рулевое управление, торможение, ускорение и т. Д.) Возможны через матрицу управления. Матрица u будет содержать роботизированный вход системы, который может быть мгновенным ускорением или расстоянием, пройденным системой от IMU или датчика одометра.

Измерительная матрица H

Фильтру также необходимо указать, что измеряется и как оно соотносится с вектором состояния. В примере транспортного средства автомобиль входит в туннель с измерением только положения в первой точке, измеряется только скорость! Значения могут быть измерены непосредственно с коэффициентом 1,0 (т. Е. Скорость измеряется непосредственно в правильной единице), поэтому только в 1,0 задается соответствующая позиция.

Если датчики измеряют в другой единице или размере по объему, отношения в измерительной матрице должны быть отображены в формуле.

Ковариационная матрица измерения шума R

Как и в одномерном случае дисперсия, неопределенность измерения также должна быть указана здесь.

Эта неопределенность измерений показывает, насколько можно доверять измеренным значениям датчиков. Поскольку мы измеряем положение и скорость, это матрица 2 × 2. Если датчик очень точный, здесь следует использовать небольшие значения. Если датчик относительно неточный, здесь следует использовать большие значения.

Единичная матрица I

И последнее, но не менее важное: необходима единичная матрица, которая будет использоваться для упрощения уравнений Калмана.

Шаг фильтрации Prediction / Predict

Эта часть фильтра Калмана теперь позволяет прогнозировать состояние системы в будущем. Кроме того, при определенных условиях можно рассчитать состояние, которое невозможно измерить! Это удивительно, но в нашем случае именно то, что нам нужно. Мы не можем измерить местоположение транспортного средства, потому что у GPS навигационного устройства нет приема в туннеле. Однако, инициализируя вектор состояния положением и измеряя скорость, динамику все еще можно использовать для оптимального предсказания положения.

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

Это оно. Фильтр Калмана сделал прогнозирующее заявление об ожидаемом состоянии системы в будущем или в наступающем временном шаге. Теперь фильтр будет измерять / корректировать и проверять, хорошо ли соответствует прогноз состояния системы новым измерениям.

Совпадение, выбранное фильтром как меньшее, иллюстрирует определенность, если нет, то что-то не так, что делает фильтр более неопределенным.

Шаг фильтра Измерить / Исправить

Примечание: следующие математические вычисления не должны быть получены.

Из датчиков поступают текущие измеренные значения, с помощью которых инновационный коэффициент (y) получается с использованием измерений, вектора состояния с измерительной матрицей.

Затем рассматривается, с какой дисперсией можно рассчитать дальше. Для этого требуется неопределенность, а также матрица измерений и неопределенность измерений.

Это определяет так называемое усиление Калмана. В нем указывается, должны ли показания или динамика системы быть более знакомыми.

Усиление Калмана уменьшится, если показания (измерения) соответствуют прогнозируемому состоянию системы. Если измеренные значения говорят об обратном, элементы матрицы K становятся больше.

Эта информация теперь используется для обновления состояния системы.

А также определили новую ковариантность для предстоящего шага прогнозирования.

Теперь вернемся к этапу прогнозирования. Графически это выглядит так:

Этот фильтр работает постоянно, пока поступают измеренные значения. Он также может быть разомкнутым, поэтому только шаг прогнозирования будет выполняться, если измерения недоступны. Тогда неопределенность становится все больше и больше.

Фильтр на работе

Когда мы едем в туннель, записывается последняя известная позиция, полученная от GPS. Фильтр Калмана все еще может предсказать положение транспортного средства, хотя он не измеряется все время

Теперь предположим, что скорость автомобиля доступна примерно каждые 20 м / с черезCAN автобус, 6 итераций — всего 0,1 с. Фильтр сходится относительно быстро, в зависимости от выбора начальных условий. Например, после 100 итераций (что эквивалентно 2 секундам на транспортном средстве) дисперсия уже очень мала, поэтому фильтр уверен в своем оценочном и обновляющем состояниях. Моя реализациялинейный фильтр Калманаможно найти здесь. Результаты:

Python-реализация фильтра Калмана

Дизайн фильтра: Как выбрать Q и R?

В целом, неважно, насколько велики числовые значения, а в какой пропорции они. Если выбранные значения в десять раз больше, это вряд ли повлияет на фильтр.Соотношение значений имеет решающее значение.Правильный выбор был бы непосредственно ответственен за работу фильтра и сформировал основной вопрос дизайна фильтра.

Этот или / или вопрос может быть решен только на основе конкретного приложения. В некоторых случаях:

  1. Мы просто хотели бы отфильтровать плохо измеряющие датчики для относительно постоянного процесса. Например, мы можем реализовать фильтр Калмана для оптимизации регулятора температуры в печи в ракете или в химической печи.
  2. Мы также хотели бы объединить несколько датчиков, и динамика должна быть сохранена. Соответственно, матрицы должны быть выбраны. Альтернативно, конечно, фильтр может быть спроектирован так, чтобы автоматически адаптироваться во время работы.

Чем отличается фильтр Калмана от рекурсивных наименьших квадратов?

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

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

Источник

Использование фильтра Калмана в прогнозе направления цены

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

Идея использования цифровых фильтров в трейдинге не нова. В том числе и я уже рассказывал об использовании фильтров низкой частоты. Но, как говорится, нет предела совершенству, и в поисках лучших стратегий рассмотрим еще один вариант и сравним результаты.

1. Принцип работы фильтра Калмана

Итак, что же такое фильтр Калмана и почему нам стоит обратить на него внимание? Википедия дает такое определение фильтра:

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

Т.е. изначально этот инструмент был разработан для работы с зашумленными данными. Способен он работать и с неполными данными. И, наконец, еще одно его достоинство — в том, что он разработан и применяется для динамических систем, к которым относится и наш ценовой график.

Работа фильтра разделена на два этапа:

  1. Экстраполяция (предсказание)
  2. Корректировка

1.1. Экстраполяция — предсказание значений системы

В основе первого этапа работы фильтра лежит некая модель анализируемого процесса. По ней строится предсказание состояния системы на один шаг вперед.

Предсказание состояния

(1.1)

  • x k — экстраполированное значение динамической системы на k-том шаге,
  • F k — матрица модели зависимости текущего состояния системы от предыдущего,
  • x^ k-1 — предыдущее состояние системы (значение фильтра на предыдущем шаге),
  • B k — матрица влияния управляющего воздействия на систему,
  • u k — управляющее воздействие на систему.

Под управляющим воздействием можно воспринимать, например, новостной фактор. Но на практике, как правило, управляющее воздействие неизвестно и упускается, а его воздействие относится к шумам.

Затем предсказывается ошибка ковариации системы:

Предсказание матрицы ковариации(1.2)

  • P k — экстраполированная ковариационная матрица вектора состояния нашей динамической системы,
  • F k — матрица модели зависимости текущего состояния системы от предыдущего,
  • P^ k-1 — скорректированная на предыдущем шаге ковариационная матрица вектора состояния,
  • Q k — ковариационная матрица шума процесса.

1.2. Корректировка значений системы

Второй этап работы фильтра начинается с измерения фактического состояния системы z k . Здесь фактически измеренное значение состояние системы указывается с учетом действительного состояния системы и погрешности измерений. В нашем случае под погрешностью измерений имеются в виду воздействия шумов на динамическую систему.

К настоящему моменту в нашем распоряжении есть две разные величины, которые представляют состояние одного динамического процесса. Это экстраполированное значение динамической системы, которое мы рассчитали на первом этапе, и фактически измеренное значение. Каждая из этих величин с определенной долей вероятности характеризует истинное состояние нашего процесса, которое, таким образом, находится где-то между ними двумя. Следовательно, наша цель — определить, в какой степени мы доверяем тому или иному значению. Для этого и проводятся итерации второго этапа фильтра Калмана.

Читайте также:  Ключ для масляного фильтра 111

Исходя из имеющихся данных, определяем отклонение фактического состояния системы от экстраполированного значения.

Отклонение фактического состояния системы от предсказанного(2.1)

  • y k — отклонение фактического состояния системы на k-том шаге от экстраполированного,
  • z k — фактическое состояние системы на k-том шаге,
  • H k — матрица измерений, которая отображает зависимость фактического состояния системы от рассчитанных данных (на практике часто принимает единичное значение),
  • x k — экстраполированное значение динамической системы на k-том шаге.

Следующим шагом рассчитывается ковариационная матрица для вектора ошибки:

Ковариационная матрица вектора ошибки(2.2)

  • S k — ковариационная матрица вектора ошибки на k-том шаге,
  • H k — матрица измерений, которая отображает зависимость фактического состояния системы от рассчитанных данных,
  • P k — экстраполированная ковариационная матрица вектора состояния нашей динамической системы,
  • R k — ковариационная матрица шума измерений.

Затем определяется оптимальное значение так называемых коэффициентов усиления, которые и отображают степень доверия расчетной и эмпирической величинам.

Коэффициенты усиления Калмана(2.3)

  • K k — матрица коэффициентов усиления Калмана,
  • P k — экстраполированная ковариационная матрица вектора состояния нашей динамической системы,
  • H k — матрица измерений, которая отображает зависимость фактического состояния системы от рассчитанных данных,
  • S k — ковариационная матрица вектора ошибки на k-том шаге.

Теперь по уже полученным коэффициентам Калмана корректируем значение состояния нашей системы и ковариационную матрицу оценки вектора состояния.

Скорректированное состояние системы(2.4)

  • x^ k и x^ k-1 — скорректированные значения на k-том и k-1 шаге,
  • K k — матрица коэффициентов усиления Калмана,
  • y k — отклонение фактического состояния системы на k-том шаге от экстраполированного.

Скорректированная ковариационная матрица вектора(2.5)

  • P^ k — скорректированная ковариационная матрица вектора состояния нашей динамической системы,
  • I — матрица идентичности,
  • K k — матрица коэффициентов усиления Калмана,
  • H k — матрица измерений, которая отображает зависимость фактического состояния системы от рассчитанных данных,
  • P k — экстраполированная ковариационная матрица вектора состояния нашей динамической системы.

Обобщить все вышесказанное можно нижеприведенной схемой

2. Практическая реализация фильтра Калмана

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

2.1. Инициализация исходных данных

Прежде чем начать писать код, определимся с исходными данными.

Как уже говорилось выше, в основе фильтра Калмана — модель динамического процесса, по которой предсказывается следующее состояние этого процесса. Изначально этот фильтр был предложен для работы с линейными системами, в которых текущее состояние системы легко задается через коэффициент к предыдущему. Нам сложнее: мы имеем дело с не линейной динамической системой, где коэффициент изменяется пошагово. Более того, у нас нет ни малейшего представления о зависимости между двумя соседними состояниями системы. Задача, казалось бы, неразрешимая. Но давайте немного схитрим и воспользуемся авторегрессионными моделями, о которых уже рассказывалось в статьях [1],[2],[3].

Итак, начнем. Для начала объявим класс CKalman, а в нем — необходимые переменные

В функции инициализации класса присвоим начальные значения переменным.

Для построения авторегрессионной модели я воспользовался алгоритмом из статьи [1]. Для этого добавим в класс две private функции.

Функция LevinsonRecursion перенесена без изменений, а функцию Autoregression я слегка модифицировал, поэтому давайте рассмотрим ее подробней. В начале функции мы проверяем наличие необходимой для анализа истории, и если ее недостаточно, возвращается false.

Загружаем необходимую историю в массив и заполняем массив фактических коэффициентов зависимости текущего состояния системы от предыдущего.

После проведенных подготовительных работ определяем количество коэффициентов авторегрессионной модели и рассчитываем их значения.

Сумму полученных коэффициентов авторегрессии приводим к «1» и устанавливаем флаг проведенного расчета в состояние true.

Далее инициализируем необходимые для фильтра переменные. В качестве ковариации шума измерений возьмем среднеквадратичное отклонений значений close за анализируемый период.

Для определения значения ковариации шума процесса сначала рассчитаем массив значений авторегрессионной модели и возьмем среднеквадратичное отклонение значений модели.

Фактические коэффициенты зависимости текущего состояния системы от предыдущего скопируем в массив cda_F, чтобы потом использовать их при расчете новых коэффициентов.

Для начального значения нашей системы возьмем среднее арифметическое из 10 последних значений.

2.2. Предсказание движения цены

После того, как мы получили все исходные данные для работы фильтра, можно приступить к его практической реализации. Первый этап работы фильтра Калмана, как уже упоминалось выше, — экстраполяция состояния системы на один шаг вперед. Создадим public функцию Forecast, в которой будут реализованы функции 1.1. и 1.2.

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

Затем рассчитываем коэффициент зависимости текущего состояния системы от предыдущего и сохраняем его в «0» ячейку массива cda_F, значения которого предварительно сдвигаем на одну ячейку.

После этого пересчитываем состояние системы и вероятность ошибки.

В конце функция возвращает прогнозное состояние системы. В нашем случае это прогнозируемая цена закрытия нового бара.

2.3. Корректировка состояния системы

На следующем этапе, после получения фактического значения закрытия бара, проведем корректировку состояния системы. Для этого создадим public функцию Correction. В ее параметрах будем передавать фактически полученное значение состояния системы, т.е. цену закрытия последнего бара.

В этой функции реализован теоретический раздел 1.2. этой статьи. С ее полным кодом можно ознакомиться во вложении. По окончанию своей работы функция возвращает скорректированное значение состояния системы.

3. Демонстрация работы фильтра Калмана на практике

Испытаем работу нашего класса по фильтру Калмана на практике. Для этого на базе класса создадим небольшой индикатор. На открытии новой свечи он будет вызывать функцию корректировки состояния системы, а затем — функцию предсказания для прогноза цены закрытия текущего бара. Не пугайтесь перестановки вызова функций класса, ведь мы будем вызывать функцию корректировки состояния для предыдущего (закрытого) бара и прогноз цены закрытия для текущего (только что открытого бара), цена закрытия которого нам неизвестна.

В индикаторе будут 2 буфера. В первый будут выводиться прогнозные значения состояния системы, во второй — скорректированные. Я намеренно создал два буфера, чтобы индикатор не перерисовывался и можно было увидеть масштабы корректировки системы на втором этапе работы фильтра. Код индикатора несложный, он приведен во вложении. Здесь же я приведу результаты его работы.

Фильтр Калмана на графике

На представленном графике отображаются три ломаные линии:

  • Черная — фактическая цена закрытия баров;
  • Красная — прогнозная цена закрытия;
  • Синяя — скорректированное фильтром Калмана состояние системы.

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

Подобный график показывает состоятельность работы используемого фильтра и возможность построения торговой системы с его использованием.

4. Создаем модуль торговых сигналов для генератора экспертов MQL5

Рассматривая график, представленный выше, можно заметить, что красная линия прогнозирования состояния системы более сглажена, по сравнению с черной линией фактической цены. При этом синяя линия скорректированного состояния системы всегда находится между двумя другими. Иными словами, если синяя линия выше красной, то это свидетельствует о бычьем тренде. И наоборот, синяя линия ниже красной говорит о медвежьем тренде. Следовательно, пересечение синей и красной линии — сигнал о смене тренда.

Для тестирования этой стратегии создадим модуль торговых сигналов для генератора экспертов MQL5. О методике создания модулей торговых сигналов уже не раз рассказывалось в статьях на этом сайте [1], [4], [5]. Я же вкратце расскажу о моментах, касающихся нашей стратегии.

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

В функции инициализации класса присвоим значения по умолчанию переменным и инициализируем класс фильтра Калмана.

Вычислять состояния системы фильтром будем в private функции CalculateIndicators. В начале функции мы проверим, не рассчитывались ли значения фильтра на текущем баре. В случае, если значения уже пересчитаны, выходим из функции.

Затем проверяем последнее состояние системы. Если оно не определено, сбрасываем флаг расчета авторегрессионной модели в классе CKalman, чтобы при последующем обращении к классу модель была пересчитана заново.

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

Затем пересчитываем значения состояния системы для всех непросчитанных баров.

После пересчета проверяем состояние системы и сохраняем время последнего вызова функции. В случае успешного завершения операций функция возвращает true.

Функции принятия решений (LongCondition и ShortCondition) имеют полностью идентичную структуру с зеркальным условием открытия сделки. Код функций рассмотрим на примере функции ShortCondition.

Сначала запускаем функцию пересчета значений фильтра. В случае неудачи пересчета значений фильтра выходим из функции и возвращаем 0.

При удачном пересчете значений фильтра сравниваем предсказанную и скорректированную величины. Если предсказанная величина больше скорректированной, то функция возвращает весовое значение. В противном случае возвращается «0».

Модуль построен по принципу «перевертыша», поэтому мы в нем не прописываем функции закрытия позиций.

С кодом всех функций можно ознакомиться в приложенных к статье файлах.

5. Тестирование советника

Подробное описание создания советника с использованием модуля торговых сигналов описано в статье [1], этот шаг пропустим. Отмечу только, что для тестирования качества сигналов советник был создан только на одном, выше созданном торговом модуле со статическим лотом и без использования трейлинг-стопа.

Тестирование советника проводилось на исторических данных за август 2017 года по EURUSD на таймфрейме Н1. Для расчета авторегрессионной модели использовались исторические данные на 3000 барах, что составляет почти 6 месяцев. Тестирование проводилось без установки стоп-лоссов и тейк-профитов, что позволило увидеть влияние только сигналов фильтра Калмана на торговлю.

Результаты тестирования показали 49.33% прибыльных сделок. При этом прибыль максимальной и средней прибыльной сделки превышает соответствующие показатели убыточных сделок. В целом это дало прибыль за тестируемый период, профит-фактор составил 1.56. Скриншоты тестирования приведены ниже.

При детальном рассмотрении сделок на ценовом графике обращают на себя внимание 2 узких места этой тактики:

  • серии неудачных сделок во флэтовых движениях;
  • поздний выход из открытой позиции.

Результаты тестирования на ценовом графике

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

Заключение

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

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

Источник