Как стать автором
Обновить

Комментарии 34

Спасибо за статью. Но у меня все тот же вопрос, что и к другим подобным примерам простых моделей — чем выгоднее фильтр Калмана по сравнению например с фильтром который просто усредняет значение в каком-то окне? Например берет среднее или медиану всех значений попавших в окно? По графикам как будто выглядит, что с подобным шумом такое усреднение справилось бы не хуже?
Усреднение в окне берёт все значения с одинаковым весом, а фильтр Калмана берёт самые новые значения с бОльшим весом.
Но главная разница — в том что фильтр Калмана позволяет оценивать состояние системы когда оно изменяется во времени. В примере с равноускоренным движением фильтр Калмана оценивает ускорение и «догоняет» график. При усреднении же просто накапливалось бы отставание оценки от реального значения.

С ускорением — хороший пример, спасибо.

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

А вот например пользовательский трафик на сайт — нужно сначала подобрать какую-то правдоподобную модель сначала? Есть какие-то методики?
Очень интересный вопрос.
Без модели фильтр Калмана теряет часть своих магических свойств и становится g-h (или альфа-бета) фильтром.
Вопросом построения моделей динамических систем занимается идентификация систем (https://ru.wikipedia.org/wiki/Идентификация_систем). Насколько я знаю, универсальной методики построения модели для произвольного процесса не существует.
Насколько я знаю, универсальной методики построения модели для произвольного процесса не существует.

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

Если модель неизвестна, то можно применять сглаживание.

От обычного LowPass фильтра (ФНЧ) до экспоненциального сглаживания (обычного, двойного, тройного...)

В каких-то случаях может подойти метод Хольта (развитие экспоненциального сглаживания).

Также может оказаться интересным фильтр Ходрика-Прескотта.

Тут надо смотреть по ситуации что лучше подойдет в том или ином случае. Иногда бывает достаточно B-сплайна или сглаживающего сплайна (с подбором коэффициента сглаживания)
Какой смысл фильтровать пользовательский трафик? Вы измеряете его с погрешностью?
Просто первый пример из не-физического мира который вспомнился.

С другой стороны, если пофантазировать то можно например представить трафик на сайт как сумму какой-то реальной модели (органический ретеншн, объем рекламы, сезонность, переходы из поиска) плюс какой-то случайный шум (случайно зашли, кто-то опубликовал ссылку). В этом случае можно было бы вычленить тренд даже в случае ускорения. Другое дело что модели нет, ускорения добиться очень сложно, да и кейс не совсем про реальное время.
Собственно, наверное, самое распространенное в быту применение фильтра Калмана — это «сглаживание» результатов измерения приемником GPS в движении. С побочными эффектами в виде «ложного заноса» на поворотах, когда фильтр оказывается слишком агрессивен.

Делал компас на Unity и для стабилизации сначала написал «усреднение в окне», но когда показания были в районе 0(360) градусов, то усреднение играло злую шутку. Удалось решить проблему только фильтром Калмана.

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

фильтром который просто усредняет значение в каком-то окне
Вы придумали фильтр скользящего среднего. Так себе фильтр, главный недостаток — вносит постоянную задержку.
вносит постоянную задержку.
Не посоветуете литературу, где бы это пояснялось с формулами? На пальцах-то понимаю, а вот доказать не возьмусь.
Не посоветуете литературу, где бы это пояснялось с формулами?
Не посоветую по одной причине: не погружался в дебри литературы. Мне доказательство не требуется: я это отставание своими глазами видел, и как этот фильтр работает понимаю.
На самом деле, это предельно просто. У вас есть N последних измерений, и за отфильтрованное значение вы принимаете их среднее арифметическое, без весовых коэффициентов.
Я просто хотел посмотреть, как оно ложится на Фурье для двух- и более мереных данных, по идее фазу сигнала должно колбасить довольно интересно.
Я далёк от Фурье, у меня просто датчик с помехами. Фильтр скользящего среднего сильно искажает форму сигнала. Фазу он искажает в том смысле, что вносит задержку. Собственно, про форму сигнала я даже не задумывался — она мне была абсолютно не важна, меня интересовало отфильтрованное значение.

Обработка сигналов это совсем не моя область, но вроде как любой FIR фильтр вносит задержку в половину размерности?

А про наблюдатель Люенбергера будет? Синергетические?
Я чувствую, что статья о чем-то важном и интересном, но не могу понять о чем и зачем это нужно.
Можно привести внятный пример — вот у нас такие-то датчики измеряют то-то. У нас есть такие-то проблемы или мы хотим то-то. Мы взяли фильтр Калмана (я так и не понял, что это), который нужен вот для чего, применили и всё стало вот так — т.е. хорошо.
У вас статья построена по принципу от общего к частному, а это предполагает, что читатель понимает, что скрывается за обобщенными формулировками. А то вопросы возникают сходу.
1. Речь о фильтре? Что фильтруется? Фильтры сигнала типа Бесселя и т.п. — это понятно, а здесь?
2. «фильтр Калмана может предугадывать, каким будет состояние системы в следующий момент времени» — если есть модель — то я и сам предскажу, в чем тут роль фильтра?
3. Так что мы получаем в результате?
Речь о фильтре? Что фильтруется? Фильтры сигнала типа Бесселя и т.п. — это понятно, а здесь?


Фильтруется случайный шум датчиков.

«фильтр Калмана может предугадывать, каким будет состояние системы в следующий момент времени» — если есть модель — то я и сам предскажу, в чем тут роль фильтра?


Фильтр использует предсказание следующего состояния на основе предыдущего для повышения эффективности фильтрации шума.

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

Каждый год на хабре выходит статья о фильтре Калмана. Я ничего не имею против — каждый объясняет по своему, и кто-то находит одни статьи более понятными, чем другие. Например, мне больше нравится эта. Но было бы удобно, если перед написанием новых статей делался ресерч существующих работ по теме на хабре, и на основе этого уже писалась бы статья — мол вот такие-то статьи на хабре уже есть, но там такой-то недостаток, а мы вот с такой стороны это объясним.
О! Спасибо! Там понятно.
Зачем? Хабр же не научный журнал.
Спасибо за статью. Мне как-то не нравится Ваше определение линейности, насколько я помню, линейной обычно называют такую систему, для которой имея произвольное состояние и передаточную функцию, мы можем восстановить состояние в произвольный момент времени, короче, требуется обратимость (переход к предыдущему или исходному состоянию путём домножения текущего на обратную передаточную функцию).

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

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

Есть классификация линейная-нелинейная, а есть классификация дискретная-непрерывная. Это две отдельные классификации. Линейность это больше про суперпозицию, f(aX+bY) = af(X)+bf(Y). В линейных системах реакция на сумму входных воздействий это сумма реакций на отдельные компоненты. В нелинейных такого нет. Всё, что про передаточные функции, это линейные системы.

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

EMA случайно не является частным случаем фильтра Калмана?

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

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

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

Для интересующихся узнать, что представляет собой фильтр Калмана, рекомендую:
How a Kalman filter works, in pictures.

Честно говоря, ожидал реализацию фильтра Калмана "на пальцах".

А вот это вот всё - "возьмём библиотеку, и вуаля", вообще фигня какая-то

Зарегистрируйтесь на Хабре, чтобы оставить комментарий