Pull to refresh

Comments 84

А покажите сравнение с фильтрацией по методу скользящего среднего — сильно ли лучше результаты?
UFO just landed and posted this here
Насколько я понимаю, данный способ введения коэффициента К — лишь один из многих способов «сообщить» фильтрующему алгоритму тип истинной (без шумов) зависимости. Вопрос в том, насколько лучше данный алгоритм фильтрует шумы по сравнению с аналогами: для показаний известного типа функций — с методом «а-ля» наименьших квадратов применительно к фильтрации; для показаний неизвестного типа функций — с методом скользящего среднего (с весовыми коэффициентами и без).
Если A!=B то любое число C можно выразить как
KA + (1-K)B

в нашем случаев A, B и К меняются на каждом шаге, поэтому это исчерпывающий ответ на Ваш вопрос
Если, честно, я не знаю, что это такое. Но если расписать формулу для упрощенного фильтра Калмана (который в последнем графике в статье), то можно получить, что отфильтрованное значение равно



Это можно назвать, каким-то там средним, наверно.
Ну я про это среднее — есть ли смысл городить огород дополнительными коэффициентами в случае неизвестного вида функции, если можно применить более простые методы фильтрации шумов?
Скользящее среднее для таких задач не подходит. К примеру, если у вас функция растет, то среднее предыдущих значений всегда будет меньше последующего значения, хотя на самом деле каждое следующее значение будет больше предыдущих.
Вообще-то не факт, ибо, во-первых, шумовая составляющая может быть разной (резкие пики вверх, например, «подбросят» отфильтрованную функцию), во-вторых, данный эффект неплохо нивелируется использованием весовых составляющих, а также выбором величины окна при таком сглаживании.
Ну да, я имел ввиду рост линейной функции, конечно. На практике да, в некоторых случаях она может давать нормальные результаты, тем не менее скользящая средняя имеет свойство запаздывать за сигналом, потому что по сути не содержит никакой информации о возможном будущем значении.
Вот кстати, на последней ситуации как раз и показан описанный выше косяк, как я понял. Если б вы на осях цихерки все-таки указали (точное время хотя бы), то можно было бы даже примерно оценить динамическое запаздывание ФК с выбранными настройками. На графике явно видно это. Если бы шум был наложен на синусоиду, то вообще в глаза бросилось бы смещение фильтрованной синусоиды относительно исходной нефильтрованной.
На последнем графике шум как-раз наложен на синусоиду.
Только показано меньше полупериода. Но даже так видно динамическое запаздывание 5-10 отсчетов. Если бы синусоида была с еще большей частотой, то запаздывание, очень возможно, будет еще больше.
На последнем графике нет синусоиды. Фильтр синтезируется для модели процесса первого порядка. То, что представлено на графике — сумма винеровского процесса, линейной функции и шума наблюдений. Заметьте, что истинного процесса там вообще нет.

Вариант картинки с истинным процессом представлен на первом графике в статье.

Не очень понимаю, о каком запаздывании тут может идти речь. Лучше данного фильтра по указанному критерию в указанных условиях в режиме реального времени Вы всё равно ничего лучше не сделаете.
Когда я моделировал второй процесс, я брал синусоиду и налагал на нее шум.
Потом, когда фильтруешь процесс и «не знаешь», что это на самом деле синусоида с шумом, пытаешься незаконно воспользоваться фильтром Калмана, в котором зашито, что этот процесс — стационарный.
Прав товарищ HomoLuden, который говорит, что будет запаздывание от синусоиды.
Тогда действительно будет «запаздывание». Синусоида имеет бесконечное число производных, соответственно такой линейный фильтр для неё придется делать бесконечного порядка. С ней всегда беда.
Скользящее среднее — это просто среднее значение n предыдущих значений. Фильтр Калмана практически идентичен экспоненциальному сглаживанию, там тоже формула — S[t] = alpha*X[t] + (1-alpha)*S[t-1] (сорри, не знаю как формулу вставить).
Да, это и есть тот самый «Второй пример» из поста. Вообще, из собственного опыта мне кажется, что в реальных задачах хватает экспоненциального сглаживания за глаза — нужно только поиграть с коэффициентом alpha. Более того, зашивать в железки честный фильтр Калмана отнюдь не лучший выбор.
Недостаток линейных фильтров — они плохо себя ведут при случайных выбросах. Если GPS вдруг скажет, что машинка находится на Луне, возвращаться на Землю ей придётся долго… Я предпочитаю медианный фильтр, когда это возможно.
Не до конца понимаю, зачем на Хабре 4ая статья по фильтру Калмана. Это при учёте того, что на Википедии тоже неплохо описано.
Имхо, эта статья — лучшее объяснение. Потому что очень чётко показано — почему так.
В других статьях на хабре нету вывода формул. А на википедии написано очень непонятно, по крайней мере, я ничего там не понял, когда читал в первый раз.
На википедии лежит перевод английской статьи, с сохранением их обозначений и примеров. Переводил я её года три назад. Её нужно существенно переработать, в используемых там обозначениях, терминах и примерах ничего не понятно. Меня останавливает то, что материал попадет под GPL и у меня потом будут проблемы с изданием учебников (в университете работаю).
К сожалению, я нуб в вопросах лицензирования. Есть ли лицензия, опубликовав под которой на википедии материал, я могу потом этот же материал использовать в печатных публикациях (с передачей ряда прав издательству)?
Лицензии википедии никак не ограничивают права автора использовать этот материал как ему угодно, они только разрешают другим людям его использовать при соблюдении определённых условий (и не разрешают отменить действие этой лицензии для тех, кто не нарушает её условий). Так что это вопрос только к издательству.
За одно только объяснение распределения Гаусса готов расцеловать!
Собирал вариометр-пищалку на arduino, и Калмановский фильтр отлично подошел для вычисления скорости изменения высоты по зашумленным показаниям датчика.
Следует отметить, что фильтр Калмана хорош ещё вот чем.

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

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

  • Сглаживание
  • Сглаживание с запаздыванием
  • Сглаживание в одной точке


Сглаживание — утрированно говоря делаем следующее. Запускает фильтр от времени 0 до времени T. Затем запускаем фильтр от времени T до времени 0. В статье написано, что коэффициент K сходится к своему «истинному» значению. Так вот. Для времени в районе 0 берём коэффициенты, полученные при обратном прогоне, а для конечных моментов времени берём коэффициенты, полученные при прямом прогоне.

Сглаживание с запаздыванием. Выбираем окошко определённой ширины (по времени), запускам в него Калмана, получаем K и применяем к текущему моменту. Не хочу говориь подробно об этом, так как сам читал про этот режим весьма вскользь.

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

Ну и напоследок, в инетернете по применению постобработки фильтра Калмана очень мало информации. Вот по сглаживанию в одной точке на русском языке так вообще один источник — переведённая книга годов 70-х. Если интересно — могу вспомнить кто автор и что за издание.
Браммер К. и Зиффлинг Г. Фильтр Калмана-Бьюси 1982 г.
PDF найти несложно при желании. Фундаментальный труд, где корректно и достаточно просто описаны основы ФК и как этот метод выводится из Гауссовско-Марковского Метода Наименьших Квадратов.
Спасибо за ссылку — не знал этой книги. А книгу, которую я упомянул, это Дж. Медич «Статистически оптимальные линейные оценки и управление», изд. «Энергия», 1973
А что делает налоговая инспекция Саратова в этом URL?
Я не понял механизм. Как такое произошло?
Это результат творчества живого поиска Google.

Если присмотреться к URL, то там видно две части — до # и после #. Налоговая инспекция находится в части до решетки, следовательно это оригинальный запрос, который был введен, например, в строке адреса браузера. Искомый же запрос находится после символа #, следовательно он был добавлен туда веб-интерфейсом гугла после ввода запроса в строку поиска в результатах поиска. Таким образом в адресную строку попало два запроса, которые и выполнились, отобразив результат последнего запроса.
Это нужно для воспроизводимости результатов живого поиска. По этому то, что изменялось на странице JavaScript'ом отражается в якоре (после #), в результате получается ссылка как бы на результат работы скриптов страницы, которую можно копировать, сохранять, передавать другим и повторно к ней возвращаться.

Жизненно необходимая кстати вещь для AJAX-сайтов.
Я видел очень удачные варианты, когда при смене содержимого страницы AJAX-ом или просто JS, в браузере меняется основная часть URL без перезагрузки страницы. Например, так сделано в TiddlyWiki

Так что по-прежнему не понимаю необходимости сохранять первичный запрос в URL…
Это называется History API, но поддерживается не во всех браузерах, вот видимо Google и использует менее красивую, но единую и кроссбраузерную реализацию.
Все просто… Искал сначала налоговую. Потом в строке поиска на странице ввел новый запрос и не обратил внимание, что в строке адреса остался прежний УРЛ
Фильтр Калмана хорош ещё и тем, что в нём встроены вычисление и учёт ненаблюдаемых параметров (скорость машинки, если она непостоянна и неизвестна).
Спасибо, всплакнул
Я экзамен по этому фильтру (системотехника) в универе в конце 90x сдал раз на 11 только (совпали в пространстве моя лень и вредность препода). Зато, когда потом на госах мне по другой дисциплине (радиоавтоматика) выпал опять этот фильтр, тут уж я расцвел во всей красе.
Аккуратная приятная статья. Небольшие замечания.

1) Оптимальность вашего решения достигается только в случае, если \ksi и \eta являются нормальными случайными величинами. Иначе — это оптимум только среди линейных фильтров.

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

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

2) То, что описано во второй главе, полноценный фильтр Калмана. Только для модели процесса первого порядка. То есть, если принимать, что на всём k-м интервале x_k остается неизменным, а при смене интервала меняется скачком до x_{k+1}. Нагребать большие ошибки вы начнете, когда эта модель перестанет согласовываться с вашим входным процессом. Например, если установите большую скорость, получите ошибку около VT/2.

PS А как Вы TeX прикрутили к хабру?
Спасибо большое за отзыв

1) Фильтр Калмана, даже если ошибки распределены по Гауссу, всегда лучший линейный фильтр. Среди нелинейных есть и лучше.
Единственное отличие двух случаев (ошибки Гауссовы или нет) состоит в том, что в случае с негауссовской ошибкой, фильтр Калмана лучший в смысле среднеквадратичного приближения. В Гауссовском же случае фильтр лучший в смысле среднего от почти любой хорошей функции. Можно посмотреть, к примеру, на теорему 2 в оригинальной статье Калмана
Мне кажется у Вас описка —
«Фильтр Калмана, даже если ошибки распределены по Гауссу, всегда лучший линейный фильтр. Среди нелинейных есть и лучше.»

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

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

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

Уравнения Стратоновича, в рамках описанной Вами задачи, позволяют рассчитать апостериорную ПВ p(x_k | z_k).

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

1) Если Вы про нормальность ошибок измерений и нормальность формирующего процесса, то АПВ p(x_k | z_k) является строго нормальной. Причем мат.ожидание этого распределения — ваша x_k^{opt}. Нетрудно показать, что в этом случае x_k^{opt} минимизирует средний квадрат e_k.

2) Если Вы про нормальность e_k при использовании ФК, то \nu и \eta нормальны. А по Вашим условиям задачи их мат. ожидание равны нулю. Возвращаемся к пункту 1.

Таким образом, в условиях Вашей задачи:
1) Если \ksi и \eta распределены нормально, то ФК является оптимальным по критерию минимума СКОшибки, как среди линейных фильтров, так и среди нелинейных. В этом случае фильтр Калмана — решение уравнений Стратоновича для вектора математического ожидания и ковариационной матрицы. То есть ФК строго описывает p(x_k | z_k).
2) Если распределение \ksi и \eta отличны от нормального, то ФК является оптимальным по критерию СКОш только в классе линейных фильтров. Оптимизация в общем случае не гарантирована. В этом случае p(x_k | z_k) не является нормальным распределением, для его описания не достаточно итеративно рассчитывать x_k^{opt} и K_k (которые суть вектор мат. ожиданий и ковариационная матрица).
Спасибо за ответ. К сожалению, не знаю аппарат Статоновича. А что из-него правда следует, что фильтр Калмана лучший среди всех фильтров на свете (если \xi и \eta нормальны)? Можете подсказать, где это лучше прочитать?
Говоря о «лучшем» нужно не забывать упоминать критерий и условия задачи. Вы критерий и условия четко обозначили в статье. Для этого критерия и для этой задачи ФК действительно оказывается лучшим.

1) Как нетрудно догадаться, разворошил улей Стратонович

Непосредственно основные труды Стратоновича перечислены на его странице в вики:
ru.wikipedia.org/wiki/Стратонович

Я их не читал, но судя по названию, интересует вот эти:
Kuznetsov P.I, Stratonovich R. L., Tikhonov V.I., Nonlinear Transformation of Stochastic Processes
Стратонович Р. Л. Условные марковские процессы и их применение к теории оптимального управления

2) Человек с большой буквы, который всё это применил на практике — Тихонов. Выжимка его работ тут: Статистический анализ и синтез радиотехнических устройств и систем

3) Второе поколение больших исследователей — Перов Александр Иванович и Харисов Владимир Назарович.

Книга Харисова (он ученик Тихонова) — выше, совместная с Тихоновым.

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

Я планирую написать на хабре пару статей на эту тему, но всё нет времени.
Спасибо большое за список литературы.
Сопутствующий вопрос — матлабовские плоты так чудно обработаны в фотошопе? Или кто-то уже написал специальный рендер для fig'ов, выдающий такую красоту?
Графики я делал так. Беру некрасивые матлабовские графики и обвожу вручную их в векторном редакторе inkscape, потом прогоняю получившийся EPS файл через latex, чтобы формулы на графиках имели TEXoвский вид.
Наверно, существует менее затратные способы.
да, для каждой формулы генерируется своя картинка.
всегда восхищает такая неленивость!
Большое спасибо за статью. Соглашусь с мнением excoder. Это лучшее по фильтру Калмана, что я читал на Хабре. Все аккуратно и по полочкам разобрано. Особенно понятно для человека, последний раз слышавшем о фильтре Калмана в институте. Сразу понимаешь зачем это нужно, как и куда это применить.
Вот бы еще в институтах так преподавали.
Напомнило. Вчера был опубликован перевод одной статьи про применение UKF (Unscented Kalman filter, фильтр, в котором мат.ожидание и дисперсия пересчитываются с помощью unscented преобразования, что позволяет получить профит в нелинейной задаче), так там UKF перевели как «запах фильтра Калмана».

www.gisa.ru/93309.html?from_email=Y
Ну как тока его не называют, и «непахнучий», и «чуткий». Но я до сих пор так не слышал как все таки по правильному. Даже на конференции по навигации в Питере, где вроде одни умные дядьки, ну и следовательно переводчики должны быть подкованные. Его там просто перевели «Калмановская фильтрация», ну просто epic fail.
Тут, по-моему, как не переводи — всё равно будет fail. Пока у нас в русском языке не появится четкий термин для unscented-преобразования, лучше писать UKF. Всем понятно, и на смех не поднимут.
Вот прочёл статью. и вот тоже как правильно инерционные датчики или инерциальные, вроде какбе второе?
Русский язык позволяет и так, и так. Технический же термин — инерциальные.

Удивительно, но журналисты умудрились из этой идеи, которой сто лет в обед, сделать сенсацию. Вот статья на ленте оказывается уже есть:
lenta.ru/news/2013/02/14/satnav/
ИМХО, инерционные — это когда они сами тормозят с измерением, то есть лагают, а инерциальные — когда торможение меряют
Какое красивое и ёмкое определение))
Но не совсем корректное…
Инерциальными бывают системы координат или навигационные системы, а датчики «инерционные», т.к. их действие основано на измерении сил или моментов инерции (например, акселерометры). Инерциальными их можно назвать, т.к. они входят в состав инерциальных навигационных систем.
Очень хорошо «разжована». Вот два раза прочесть и всё будет НАКОНЕЦ-То! понятно
А можно еще дальше обобщить — factor graphs, не только kalman filtering, но и много других GM и все в едином фреймворке.
Адский переход от повторного интеграла к произведению интегралов (в доказательстве Exy=ExEy).
Очень доходчиво. Искала информацию после прочтения статьи, где применялся фильтр. Вы прям все по полочкам разложили, спасибо!
фрагмент «Из того что все случайные величины, входящие в выражение для, независимы, следует, что все «перекрестные» члены равны нулю:»
можно расписать подробнее, а именно:
Из того, что все случайные величины в выражении независимы, то следует! что их ковариация = 0,
Ковариация = Е(xy)-E(x)*E(y) = 0, учитывая, что по условию средние значения ошибок случайных величин у нас E(x) = E(y) = 0,
то E(xy) = 0. и т.д.
Вы абсолютно правы. Спасибо за находку. Как появится время попробую исправить неточность.
Спасибо,
важно сохранять последовательность и степень очевидности (чтобы было понятно),
например
«Это выражение принимает минимальное значение, когда (приравниваем производную к нулю) » не очевидна, так как производная равно нулю и при максимуме или при минимуме, или вообще даже когда функция — прямая горизонтальная линия :)))

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

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

На счёт центральной предельной теоремы.

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

2) Так же есть более продвинутая Теорема — Теорема нашего соотечественника — Ляпунова для Теории Вероятности. Которая более продвинутая нежелели чем Центральная Предельная Теорема.

Буду рад если этот комментарий может пригодиться для прокачки вашей замечательной статьи.
У вас есть раздел про «Независимые случайные величины»

Независимость в Теории Вероятности по мнению одного из зарубежных математиков в области Теории Вероятности и мат статистики — мутная тема
“independent random variables were to me (and others, including my teacher Steinhaus) shadowy and not really well-defined objects” — Mark Kac

Когда я учился в университете в МГТУ. В одной из книг математической серии
( «XVI Теория вероятностей» под редакцией Зарубина, Кришенко этот факт так же отмечался)

С теоретической точки зрения:
Дело в том, что причинно-следственная независимость вроде как бы влечёт, что P(AB)=P(A)P(B)
Если P — это статическая вероятность померенная по происхождения события A, B и AB, а не аксиоматическая мера то такой вещей кажется «разумным».

Но рассмотрение этого факта в другую сторону из того что они независимы причинно-следственные будет ли выполняться P(AB)=P(A)P(B) — не совсем понятно

С практической точки зрения:
Очень ловко подменяется понятие «введённой независимости в курсе тер.вера» и «реальной» в головах инженеров.

Будьте аккуратны!)

Я делюсь с соотечественниками, тем что скорее всего интересно любому инженеру. Проставление минусов меня только уводит от того, что я не буду делиться знаниями со своими соотечественниками… Хватит взрывать свою же нацию изнутри. Пора переключиться от критики к поддержке...(Если вы ещё не поняли в чём секрет успеха США)
Отличный пост, я получила громадное удовольствие при чтении! В нашей области это редко случается.
Sign up to leave a comment.

Articles