README.md

    Фильтры Калмана и Байеса в Python (очень вольный перевод на русский книги Роджера Лаббе)

    Вводный курс для понимания фильтров Калмана и Байеса. На правах переводчика, я адаптировал её к уровню студентов третьего-четвёртого курса, убрав очевидно “детские” пояснения. Но при этом конечно постарался сохранить все авторские примеры, придающие такую живость (и ценность) повествованию.

    Книга написана с использованием Jupyter Notebook, на Python. Это даёт возможность запускать и изменять демонстрационный код, прямо в книге. Что может быть лучше для обучения?

    alt tag

    Что такое фильтры Калмана и Байеса?

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

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

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

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

    Если бы я спросил вас, куда направляется моя машина в этот момент, вы бы понятия не имели. Вы бы предложили число от 1° до 360° градусов, и у вас был бы шанс оказаться правым 1 из 360. Теперь предположим, что я сказал вам, что 2 секунды назад его курс был 243°. За 2 секунды моя машина не смогла развернуться очень далеко, так что вы могли бы сделать гораздо более точный прогноз. Вы используете прошлую информацию для более точного определения информации о настоящем или будущем.

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

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

    Допустим, мы отслеживаем объект, и датчик сообщает, что он внезапно изменил направление. Действительно ли он включился, или данные зашумлены? Это зависит. Если это реактивный истребитель, мы были бы очень склонны поверить сообщению о внезапном маневре. Если бы это был грузовой поезд на прямом пути, мы бы сделали скидку на это. Мы бы еще больше изменили наши убеждения в зависимости от того, насколько точен датчик. Наши убеждения зависят от прошлого и от наших знаний о системе, которую мы отслеживаем, а также от характеристик датчиков.

    Фильтр Калмана был изобретен Эмилем Кальманом для решения такого рода задач математически оптимальным способом. Его первое применение было во время полетов “Аполлона” на Луну, и с тех пор он использовался в самых разных областях. Фильтры Калмана есть в самолетах, на подводных лодках и на крылатых ракетах. Уолл-стрит использует их для отслеживания рынка. Они используются в роботах, в датчиках Интернета вещей (IoT) и в лабораторных приборах. Химические заводы используют их для контроля и мониторинга реакций. Они используются для выполнения медицинской визуализации и для удаления шума из сердечных сигналов. Если это связано с датчиком и / или данными временных рядов, обычно используется фильтр Калмана или близкий родственник фильтра Калмана.

    Мотивация

    Мотивацией для этой книги послужило мое желание мягко познакомить с фильтрацией по Калману. Я инженер-программист, который провел почти два десятилетия в области авионики, и поэтому я всегда сталкивался с фильтром Калмана, но никогда не внедрял его сам. По мере того как я переходил к решению задач отслеживания с помощью компьютерного зрения, необходимость в этом стала насущной. В этой области есть классические учебники, такие как отличная работа Гревала и Эндрю Фильтрация Калмана. Но сесть и попытаться прочитать многие из этих книг - это печальный опыт, если у вас нет необходимого опыта. Обычно первые несколько глав охватывают несколько лет обучения математике в бакалавриате, беспечно отсылая вас к учебникам по таким темам, как математическое исчисление Ито, и представляют статистику за целый семестр в нескольких кратких абзацах. Это хорошие тексты для старших курсов бакалавриата и бесценная ссылка для исследователей и профессионалов, но для более случайного читателя это действительно сложно. Символика вводится без объяснений, в разных текстах используются разные термины и переменные для одной и той же концепции, а книги почти лишены примеров или проработанных проблем. Я часто обнаруживал, что могу разобрать слова и понять математику определения, но понятия не имел о том, какие явления реального мира они описывают. “Но что это значит?” - была моя повторяющаяся мысль.

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

    По мере того, как я начинал понимать математику и теорию, возникало все больше трудностей. Автор книги или статьи делает какое-то утверждение о факте и представляет график в качестве доказательства. К сожалению, мне непонятно, почему это утверждение верно, равно как и способ сделать этот сюжет очевидным. Или, может быть, мне интересно: “Верно ли это, если R = 0?” Или автор предоставляет псевдокод на таком высоком уровне, что реализация неочевидна. Некоторые книги предлагают код Matlab, но у меня нет лицензии на этот дорогой пакет. Наконец, многие книги заканчивают каждую главу множеством полезных упражнений. Упражнения, которые вам нужно понять, если вы хотите реализовать фильтры Калмана для себя, но упражнения без ответов. Если вы используете книгу в классе, возможно, это нормально, но это ужасно для независимого читателя. Мне неприятно, что автор утаивает от меня информацию, предположительно, чтобы избежать “обмана” со стороны ученика в классе.

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

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

    Эта книга интерактивна. Хотя вы можете прочитать его онлайн как статический контент, я настоятельно призываю вас использовать его по назначению. Он написан с использованием Jupyter Notebook, который позволяет мне объединять текст, математику, Python и вывод на Python в одном месте. Каждый график, каждая часть данных в этой книге генерируются с помощью Python, который доступен вам прямо в записной книжке. Хотите удвоить значение параметра? Щелкните по ячейке Python, измените значение параметра и нажмите “Выполнить”. В книге появится новый сюжет или печатная продукция.

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

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

    Наконец, эта книга бесплатна. Стоимость книг, необходимых для изучения фильтрации Калмана, несколько непомерно высока даже для такого инженера из Силиконовой долины, как я; я не могу поверить, что они доступны кому-то в условиях депрессии или студенту, испытывающему финансовые трудности. Я так много получил от свободного программного обеспечения, такого как Python, и бесплатных книг, таких как книги Аллена Б. Дауни здесь. Пришло время отплатить за это. Итак, книга бесплатна, она размещена на бесплатных серверах, и для ее создания используется только бесплатное и открытое программное обеспечение, такое как IPython и MathJax.

    Чтение онлайн

    Книга написана как сборник записных книжек Jupyter, интерактивной браузерной системы, которая позволяет вам комбинировать текст, Python и математику в вашем браузере. Существует несколько способов прочитать их онлайн, перечисленных ниже.

    binder

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

    Binder

    nbviewer

    Веб-сайт http://nbviewer.org предоставляет сервер ноутбуков Jupyter, который отображает записные книжки, хранящиеся на github (или где-либо еще). Рендеринг выполняется в режиме реального времени, когда вы загружаете книгу. Вы можете использовать эту nbviewer ссылку, чтобы получить доступ к моей книге через nbviewer. Если вы прочтете мою книгу сегодня, а завтра я внесу изменения, то, когда вы вернетесь завтра, вы увидите эти изменения. Записные книжки отображаются статически - вы можете читать их, но не изменять или запускать код.

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

    Загрузка и запуск книги

    Однако эта книга задумана как интерактивная, и я рекомендую использовать ее в такой форме. Настройка требует немного больше усилий, но оно того стоит. Если вы установите IPython и некоторые вспомогательные библиотеки на свой компьютер, а затем клонируете эту книгу, вы сможете самостоятельно запускать весь код из книги. Вы можете проводить эксперименты, видеть, как фильтры реагируют на разные данные, видеть, как разные фильтры реагируют на одни и те же данные, и так далее. Я нахожу такого рода немедленную обратную связь жизненно важной и бодрящей. Вам не нужно задаваться вопросом “что произойдет, если”. Попробуйте и посмотрите!

    Книгу и вспомогательное программное обеспечение можно загрузить с GitHub, выполнив эту команду в командной строке:

    git clone --depth=1 https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python.git
    pip install filterpy
    

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

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

    jupyter notebook
    

    Это откроет окно браузера, показывающее содержимое базового каталога. Книга разделена на главы, каждая из которых содержится в одной записной книжке IPython (файлы этих записных книжек имеют расширение .ipynb). Например, чтобы прочитать главу 2, нажмите на файл 02-Discrete-Bayes.ipynb. Иногда существуют вспомогательные записные книжки для выполнения таких действий, как создание анимаций, которые отображаются в главе. Они не предназначены для чтения конечным пользователем, но, конечно, если вам интересно, как создается анимация, продолжайте и посмотрите. Вы можете найти эти записные книжки в папке с именем Supporting_Notebooks.

    По общему признанию, это несколько громоздкий интерфейс к книге; Я иду по стопам нескольких других проектов, которые несколько перепрофилируют Jupyter Notebook для создания целых книг. Я чувствую, что небольшие неприятности приносят огромную пользу - вместо того, чтобы загружать отдельную базу кода и запускать ее в IDE, пока вы пытаетесь читать книгу, весь код и текст находятся в одном месте. Если вы хотите изменить код, вы можете сделать это и сразу увидеть последствия вашего изменения. Если вы обнаружите ошибку, вы можете исправить ее и отправить обратно в мой репозиторий, чтобы все в мире получили выгоду. И, конечно же, вы никогда не столкнетесь с проблемой, с которой я постоянно сталкиваюсь с традиционными книгами - книга и код не синхронизированы друг с другом, и вам остается ломать голову над тем, какому источнику доверять.

    Сопутствующее программное обеспечение

    Latest Version

    Я написал библиотеку Python с байесовской фильтрацией с открытым исходным кодом под названием FilterPy. Я сделал проект доступным в PyPI, индексе пакетов Python. Чтобы установить из PyPI, в командной строке введите команду

    pip install filterpy
    

    Если у вас нет pip, вы можете следовать приведенным здесь инструкциям: https://pip.pypa.io/en/latest/installing.html.

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

    Filter Py размещен на github по адресу (https://github.com/rlabbe/filterpy). Если вам нужна версия bleeding edge, вам нужно будет получить копию с github и следовать инструкциям по установке вашего Python, чтобы добавить ее в путь поиска Python. Это может привести к некоторой нестабильности, поскольку вы можете не получить протестированную версию, но в качестве преимущества вы также получите все тестовые сценарии, используемые для тестирования библиотеки. Вы можете изучить эти сценарии, чтобы увидеть множество примеров написания и запуска фильтров вне среды Jupyter Notebook.

    Альтернативный способ запуска книги в среде Conda

    Если у вас установлена conda или miniconda, вы можете создать среду с помощью

    conda env update -f environment.yml
    

    и активировать её

    conda activate kf_bf
    

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

    conda deactivate kf_bf
    

    Issues or Questions

    Если у вас есть комментарии, вы можете написать вопрос на GitHub, чтобы все могли прочитать его вместе с моим ответом. Пожалуйста, не рассматривайте это только как способ сообщить об ошибках. В качестве альтернативы я создал комнату gitter для более неформального обсуждения. Join the chat at https://gitter.im/rlabbe/Kalman-and-Bayesian-Filters-in-Python

    Лицензия

    Creative Commons License
    Kalman and Bayesian Filters in Python by Roger R. Labbe is licensed under a Creative Commons Attribution 4.0 International License.

    All software in this book, software that supports this book (such as in the the code directory) or used in the generation of the book (in the pdf directory) that is contained in this repository is licensed under the following MIT license:

    The MIT License (MIT)

    Copyright (c) 2015 Roger R. Labbe Jr

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.TION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Описание

    Перевод отличной книги Р.Лаббе "Фильтры Калмана и Байеса на Python".

    Конвейеры
    0 успешных
    0 с ошибкой