- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему Python?
- •План книги
- •Версия Python, платформа и IDE
- •Установка Python
- •Запуск Python
- •Использование виртуальной среды
- •Вперед!
- •Глава 1. Спасение моряков с помощью теоремы Байеса
- •Теорема Байеса
- •Проект #1. Поиск и спасение
- •Стратегия
- •Установка библиотек Python
- •Код для теоремы Байеса
- •Время сыграть
- •Итоги
- •Дополнительная литература
- •Усложняем проект. Более грамотный поиск
- •Усложняем проект. Поиск лучшей стратегии с помощью MCS
- •Усложняем проект. Вычисление вероятности обнаружения
- •Глава 2. Установление авторства с помощью стилометрии
- •Проект #2: «Собака Баскервилей», «Война миров» и «Затерянный мир»
- •Стратегия
- •Установка NLTK
- •Корпусы текстов
- •Код стилометрии
- •Итоги
- •Дополнительная литература
- •Практический проект: охота на собаку Баскервилей с помощью распределения
- •Практический проект: тепловая карта пунктуации
- •Усложняем проект: фиксирование частотности
- •Глава 3. Суммаризация текста с помощью обработки естественного языка
- •Стратегия
- •Веб-скрапинг
- •Код для «У меня есть мечта»
- •Установка gensim
- •Код для суммаризации речи «Заправляйте свою кровать»
- •Проект #5. Суммаризация речи с помощью облака слов
- •Модули Word Cloud и PIL
- •Код для создания облака слов
- •Итоги
- •Дополнительная литература
- •Усложняем проект: ночные игры
- •Усложняем проект: суммаризация суммаризаций
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Одноразовый блокнот
- •Шифр «Ребекка»
- •Проект #6. Цифровой ключ к «Ребекке»
- •Стратегия
- •Код для шифрования
- •Отправка сообщений
- •Итоги
- •Дополнительная литература
- •Глава 5. Поиск Плутона
- •Проект #7. Воссоздание блинк-компаратора
- •Стратегия
- •Данные
- •Код блинк-компаратора
- •Использование блинк-компаратора
- •Проект #8. Обнаружение астрономических транзиентов путем дифференцирования изображений
- •Стратегия
- •Код для детектора транзиентов
- •Использование детектора транзиентов
- •Итоги
- •Дополнительная литература
- •Практический проект: представление орбитальной траектории
- •Практический проект: найди отличия
- •Усложняем проект: сосчитаем звезды
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Цель миссии «Аполлон-8»
- •Траектория свободного возврата
- •Задача трех тел
- •Проект #9. На Луну с «Аполлоном-8»!
- •Использование модуля turtle
- •Стратегия
- •Код программы для расчета свободного возврата «Аполлона-8»
- •Выполнение симуляции
- •Итоги
- •Дополнительная литература
- •Практический проект: симуляция шаблона поисков
- •Практический проект: запусти меня!
- •Практический проект: останови меня!
- •Усложняем проект: симуляция в истинном масштабе
- •Усложняем проект: реальный «Аполлон-8»
- •Глава 7. Выбор мест высадки на Марсе
- •Посадка на Марс
- •Карта MOLA
- •Проект #10. Выбор посадочных мест на Марсе
- •Стратегия
- •Код для выбора мест посадки
- •Результаты
- •Итоги
- •Дополнительная литература
- •Практический проект: убедимся, что рисунки становятся частью изображения
- •Практический проект: визуализация профиля высот
- •Практический проект: отображение в 3D
- •Практический проект: совмещение карт
- •Усложняем проект: три в одном
- •Усложняем проект: перенос прямоугольников
- •Глава 8. Обнаружение далеких экзопланет
- •Транзитная фотометрия
- •Проект #11. Симуляция транзита экзопланеты
- •Стратегия
- •Код для транзита
- •Эксперименты с транзитной фотометрией
- •Проект #12. Получение изображений экзопланет
- •Стратегия
- •Код для пикселизатора
- •Итоги
- •Дополнительная литература
- •Практический проект: обнаружение инопланетных мегаструктур
- •Практический проект: обнаружение транзита астероидов
- •Практический проект: добавление эффекта потемнения к краю
- •Практический проект: обнаружение пятен на звездах
- •Практический проект: обнаружение инопланетной армады
- •Практический проект: обнаружение планеты с луной
- •Практический проект: измерение продолжительности экзопланетного дня
- •Усложняем проект: генерация динамической кривой блеска
- •Глава 9. Как различить своих и чужих
- •Обнаружение лиц на фотографиях
- •Проект #13. Программирование робота-часового
- •Стратегия
- •Результаты
- •Обнаружение лиц в видеопотоке
- •Итоги
- •Дополнительная литература
- •Практический проект: размытие лиц
- •Усложняем проект: обнаружение кошачьих мордочек
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Распознавание лиц с помощью LBPH
- •Схема распознавания лиц
- •Извлечение гистограмм локальных бинарных шаблонов
- •Проект #14. Ограничение доступа к инопланетному артефакту
- •Стратегия
- •Поддержка модулей и файлов
- •Код для захвата видео
- •Код для обучения алгоритма распознавания лиц
- •Код для прогнозирования лиц
- •Результаты
- •Итоги
- •Дополнительная литература
- •Усложняем проект: добавление пароля и видеозахвата
- •Усложняем проект: похожие лица и близнецы
- •Усложняем проект: машина времени
- •Глава 11. Создание интерактивной карты побега от зомби
- •Проект #15. Визуализация плотности населения с помощью хороплетной карты
- •Стратегия
- •Библиотека анализа данных
- •Библиотеки bokeh и holoviews
- •Установка pandas, bokeh и holoviews
- •Работа с данными по уровню безработицы и плотности населения в округах и штатах
- •Разбираем код holoviews
- •Код для отрисовки хороплетной карты
- •Планирование маршрута
- •Итоги
- •Дополнительная литература
- •Усложняем проект: отображение на карте изменения численности населения США
- •Глава 12. Находимся ли мы в компьютерной симуляции?
- •Проект #16. Жизнь, Вселенная и пруд черепахи Йертл
- •Код симуляции пруда
- •Следствия симуляции пруда
- •Измерение затрат на пересечение строк или столбцов сетки
- •Результаты
- •Стратегия
- •Итоги
- •Дополнительная литература
- •Дополнение
- •Усложняем проект: поиск безопасного места в космосе
- •Усложняем проект: а вот и Солнце
- •Усложняем проект: взгляд глазами собаки
- •Усложняем проект: кастомизированный поиск слов
- •Усложняем проект: что за сложную паутину мы плетем
- •Усложняем проект: идем вещать с горы
- •Решения для практических проектов
- •Глава 2. Определение авторства с помощью стилометрии
- •Охота на собаку Баскервилей с помощью распределения
- •Тепловая карта пунктуации
- •Глава 4. Отправка суперсекретных сообщений с помощью книжного шифра
- •Составление графика символов
- •Отправка секретов шифром времен Второй мировой войны
- •Глава 5. Поиск Плутона
- •Представление орбитальной траектории
- •Глава 6. Победа в лунной гонке с помощью «Аполлона-8»
- •Симуляция шаблона поисков
- •Заведи меня!
- •Останови меня!
- •Глава 7. Выбор мест высадки на Марсе
- •Убеждаемся, что рисунки становятся частью изображения
- •Визуализация профиля высоты
- •Отображение в 3D
- •Совмещение карт
- •Глава 8. Обнаружение далеких экзопланет
- •Обнаружение инопланетных мегаструктур
- •Обнаружение транзита астероидов
- •Добавление эффекта потемнения к краю
- •Обнаружение инопланетной армады
- •Обнаружение планеты с луной
- •Измерение продолжительности экзопланетного дня
- •Глава 9. Как различить своих и чужих
- •Размытие лиц
- •Глава 10. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Проект #1. Поиск и спасение 29
Человеческая интуиция подсказывает: если что-то лежит не там, где мы рассчитываем, то шансы на то, что оно находится где-то в другом месте, возрастают. Теорема Байеса это учитывает, в связи с чем повышается вероятность того, что очки находятся в какой-то из других комнат. Однако это может произойти, только если изначально была вероятность их нахождения в другой комнате.
Формула для вычисления вероятности того, что очки находятся в заданной комнате, с учетом эффективности поиска выглядит так:
Здесь G — это вероятность того, что очки находятся в комнате, E —эффектив- ность поиска, а Pprior — априорная, или начальная, оценка вероятности до получения новых данных.
Вы можете получить обновленную вероятность того, что очки находятся в кабинете, подставив целевую вероятность и вероятность поиска в уравнение таким образом:
Как видите, простая математика может быстро стать неподъемной, если делать вычисления вручную. К счастью, мы живем в чудесную компьютерную эпоху, что позволяет поручить всю нудную работу Python.
Проект #1. Поиск и спасение
Сейчас вы напишете на Python программу, которая использует теорему Байеса для поиска одинокого моряка, пропавшего у мыса Python. Как руководитель поисково-спасательных операций береговой охраны вы уже опросили его жену и определили, когда и где моряка засекли в последний раз — после этого уже прошло шесть часов. Он сообщил по радио, что покидает тонущий корабль, но нет никаких данных о том, находится ли он в спасательной лодке или дрейфует в море. Воды у мыса теплые, но если он находится в воде, то примерно через 12 часов наступит переохлаждение организма. При условии, что он одет в спасательный жилет и ему благоволит судьба, у него есть шансы продержаться три дня.
У мыса Python сложные океанические течения (рис. 1.3), сейчас дует юго-запад ный ветер. Видимость хорошая, но волнение почти не позволяет разглядеть человеческую голову.
30 Глава 1. Спасение моряков с помощью теоремы Байеса
Рис. 1.3. Океанические течения у мыса Python
В реальной жизни вы передали бы всю информацию в систему оптимального планирования поисково-спасательных операций (Search and Rescue Optimal Planning System, SAROPS) береговой охраны. Это программное обеспечение учитывает такие факторы, как ветер, приливы и течения, находится ли тело в воде или на лодке и пр. На основе этих данных программа генерирует прямоугольные области поиска, вычисляет начальные вероятности нахождения моряка в каждой из них и составляет график наиболее эффективных траекторий полетов.
Мы предположим, что SAROPS определила три области поиска. Все, что нужно сделать, — это написать программу, которая применяет правило Байеса. При этом ресурсов у вас хватает на поиск в двух из трех областей за день. Вам нужно решить, как эти ресурсы распределить. Это очень трудно, но у вас есть мощный помощник — теорема Байеса.
ЗАДАЧА
Создать поисково-спасательную игру, в которой теорема Байеса используется для определения следующего шага при выполнении поиска.
Проект #1. Поиск и спасение 31
Стратегия
Поиск моряка подобен поиску очков в предыдущем примере. Вы начнете с базовых целевых вероятностей его местоположения и будете обновлять их по мере получения результатов поиска. Если вы достигнете высокой эффективности поиска в области, но ничего не найдете, то вероятность того, что моряк находится в другой области, увеличится.
Здесь, как и в реальной жизни, есть два варианта, когда все может пойти не так: тщательный поиск в области, не увенчавшийся успехом, или плохой поиск, при котором усилия целого дня затрачиваются впустую. Если приравнять это к показателям эффективности поиска, то в первом случае вы можете получить SEP, равный 0.85, но не произвести поиск моряка в оставшихся 15 % области. Во втором же случае SEP будет 0.2 и у вас останутся неисследованными 80 % области.
Можете представить себе дилемму, которая возникает у руководителей реальных спасательных операций? Послушаете ли вы собственную интуицию, проигнорировав Байеса? Будете ли придерживаться чистой холодной логики Байеса, так как верите, что это наилучший вариант? А может, будете действовать целесообразно и подстрахуете свою карьеру и репутацию, строго следуя правилу Байеса, даже когда в нем не уверены?
В помощь игроку вы, используя библиотеку OpenCV, создадите интерфейс для работы с программой. Несмотря на то что интерфейс может быть простым, например в виде встроенного в оболочку меню, вам также понадобится карта мыса и областей поиска. На карте вы будете отмечать последнее известное местоположение моряка, а также место его обнаружения. Библиотека OpenCV является отличным ресурсом для этой игры, потому что позволяет использовать изображения, а также добавлять текст и рисунки.
Установка библиотек Python
OpenCV — это крупнейшая в мире библиотека компьютерного зрения. Компьютерное зрение — область глубокого обучения, позволяющая машинам видеть, распознавать и обрабатывать изображения, подобно человеку. Зародилась OpenCV в 1999 году как инициатива Intel Research, а теперь поддерживается OpenCV Foundation, некоммерческой организацией, предоставляющей программное обеспечение бесплатно.
Написана эта библиотека на C++, но есть и поддержка других языков, а именно Python и Java. Несмотря на то что в первую очередь она предназначена для приложений компьютерного зрения, работающих в реальном времени, OpenCV
32 Глава 1. Спасение моряков с помощью теоремы Байеса
также включает стандартные инструменты по работе с изображениями, подобные используемым в Python Imaging Library. На момент написания книги текущая версия библиотеки — OpenCV 4.1.
Для выполнения числовых и научных вычислений в Python этой библиотеке требуются пакеты Numerical Python (NumPy) и SciPy. OpenCV рассматривает изображения как трехмерные массивы NumPy (рис. 1.4). Это дает ей максимальную функциональную совместимость с другими научными библиотеками Python.
|
|
40 |
41 |
42 |
43 |
44 |
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
20 |
21 |
22 |
23 |
24 |
49 |
|
|||
|
|
|
|
|
|
|
|
|
|
|
0 |
1 |
2 |
|
3 |
|
4 |
|
|
|
|
|
|
|
29 |
54 |
|
|||||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
6 |
7 |
|
8 |
|
9 |
|
34 |
|
К а а а |
|
|
|
59 |
|||||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
10 |
11 |
12 |
|
13 |
|
14 |
|
|
|
|
|
|
|
39 |
З а а |
||||||
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
16 |
17 |
|
18 |
|
19 |
|
С а а |
||
|
|
|
|
|
|
|
|
|
|
|
Рис. 1.4. Визуальное представление трехканального массива цветного изображения
OpenCV хранит свойства в виде строк, столбцов и каналов. «Форма» изображения с рис. 1.4 будет выражена кортежем из трех элементов (4, 5, 3). Каждый стек ячеек, например 0-20-40 или 19-39-59, представляет один пиксель. Числа показывают значения интенсивности каждого цветового канала для заданного пикселя.
Поскольку для многих проектов в книге нам потребуются библиотеки NumPy и matplotlib, сейчас самое время их установить.
Это можно сделать многими способами. Один из них — использование SciPy, открытой библиотеки Python, применяемой для научных и технических вычислений (подробнее — на https://scipy.org/index.html).
В качестве альтернативы: если вы собираетесь анализировать множество данных и выполнять чертежи для собственных задач, то можете скачать и использовать бесплатные дистрибутивы Python, например Anaconda или Enthought Canopy, которые работают с Windows, Linux и macOS. Эти дистрибутивы избавят
Проект #1. Поиск и спасение 33
вас от необходимости поиска и установки нужных версий всех необходимых научных библиотек, таких как NumPy, SciPy и т. д. Список подобных дистрибутивов вместе со ссылками на их сайты можно найти здесь: https://scipy.org/install.html.
Установка NumPy и других научных библиотек с помощью pip
Если вы хотите установить эти продукты напрямую, то используйте pip (Preferred Installer Program), систему управления библиотеками, упрощающую установку ПО для Python (подробнее — на https://docs.python.org/3/installing/). Windows и macOS версии Python, начиная с 3.4, содержат pip по умолчанию. Пользователи Linux могут установить pip отдельно. Для установки или обновления pip обратитесь к инструкциям на странице https://pip.pypa.io/en/stable/installation/
или найдите онлайн-руководство по инсталляции pip для вашей операционной системы.
Я использовал pip для установки научных пакетов, используя инструкции с https://scipy.org/install.html. Так как matplotlib требует несколько зависимостей, их также нужно установить. Для Windows выполните приведенную ниже команду (Python 3) с помощью PowerShell, запущенной (через Shift-правый клик) из каталога с текущей установкой Python:
$ python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
Если у вас установлены и Python 2, и Python 3, то вместо python используйте python3. Чтобы убедиться в том, что NumPy был установлен и стал доступен для OpenCV, откройте оболочку Python и введите:
>>> import numpy
Если ошибки не возникнет, то можно устанавливать OpenCV.
Установка OpenCV через pip
Инструкции по установке OpenCV вы найдете на https://pypi.org/project/opencvpython/. Для инсталляции OpenCV в стандартных средах (Windows, macOS и почти всех дистрибутивах GNU/Linux) введите в PowerShell или терминале следующее:
pip install opencv-contrib-python
либо
python -m pip install opencv-contrib-python