- •Об авторе
- •О научных редакторах
- •Благодарности
- •От издательства
- •Введение
- •Для кого эта книга?
- •Почему 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. Ограничение доступа по принципу распознавания лиц
- •Усложняем проект: добавление пароля и видеозахвата
Дополнительная литература 53
Вывод ниже представляет одну из худших ситуаций, в которой может оказаться тот, кто принимает решения:
Поиск 2 Результаты 1 = Не найден Поиск 2 Результаты 2 = Не найден
Поиск 2 Эффективность (E):
E1 = 0.000, E2 = 0.234, E3 = 0.610
Новые вероятности местонахождения (P) для поиска 3:
P1 = 0.382, P2 = 0.395, P3 = 0.223
После поиска 2, когда остается всего один шанс, целевые вероятности оказываются почти равны, поэтому сложно принять решение о дальнейшем направлении поиска. В этом случае грамотное решение — разделить усилия по двум областям и уповать на лучшее.
Сыграйте несколько раз, вслепую обыскивая области в порядке начальной вероятности, направляя двойные усилия на область 2, затем 3 и, наконец, 1. Затем попробуйте неукоснительно следовать результатам правила Байеса. После этого попробуйте разделить поисковые усилия между областями с двумя наивысшими вероятностями. И в завершение дайте волю своей интуиции, отвергая рекомендации Байеса, если считаете это необходимым. Как это обычно случается, с увеличением областей поиска и дней поиска интуиция очень скоро даст сбой.
Итоги
В этой главе вы изучили правило Байеса, простую статистическую теорему, которая широко применяется и в наше время. Вы написали программу, которая использовала эту теорему для получения новой информации — в форме оценок эффективности поиска — и обновления вероятности нахождения потерянного моряка в каждой исследуемой области.
Вы также скачали и использовали несколько научных пакетов, таких как NumPy и OpenCV, которые еще будете неоднократно использовать, изучая материал этой книги. При этом вы применили полезные модули itertools, sys и random из стандартной библиотеки Python.
Дополнительная литература
Книга «The Theory That Would Not Die: How Bayes’ Rule Cracked the Enigma Code, Hunted Down Russian Submarines, and Emerged Triumphant from Two Centuries of Controversy» (Yale University Press, 2011), написанная Шэрон Берч Макгрейн (Sharon Bertsch McGrayne), рассказывает об открытии и противоречивости истории теоремы Байеса. В книге есть несколько примеров применения
54 Глава 1. Спасение моряков с помощью теоремы Байеса
этой теоремы, один из которых и вдохновил меня на создание сценария с пропавшим моряком.
Обширный источник документации для NumPy вы найдете здесь: https://docs. scipy.org/doc/.
Усложняем проект. Более грамотный поиск
На данный момент программа bayes.py помещает все координаты области поиска в список и случайным образом их перетасовывает. В итоге впоследствии могут быть выбраны те варианты поиска в той же области, которые уже были выполнены. Это необязательно плохо в реальной жизни, так как моряк будет постоянно дрейфовать, но в нашем случае лучше охватить максимальный участок без повторов.
Скопируйте и отредактируйте программу, чтобы она отслеживала, области с какими координатами уже были исследованы, и исключала их из будущих поисков (пока снова не будет вызвана main(), если моряка обнаружат или игрок выберет вариант 7 в меню для перезапуска). Протестируйте обе версии игры, чтобы увидеть, заметно ли влияют на нее внесенные изменения.
Усложняем проект. Поиск лучшей стратегии с помощью MCS
В моделировании методом Монте-Карло (Monte Carlo simulation, MCS) задействована случайная выборка для прогнозирования результатов в рамках заданных условий. Создайте версию bayes.py, которая автоматически выбирает элементы меню и отслеживает тысячи результатов, позволяя вам определить наиболее эффективную стратегию поиска. К примеру, настройте программу на выбор элементов 1, 2 или 3 в зависимости от наивысшей целевой вероятности по Байесу, а затем запишите номер поиска, который приведет к обнаружению моряка. Повторите эту процедуру 10 000 раз и возьмите среднее по всем номерам поиска. Затем повторите цикл, выбирая элементы меню 4, 5 или 6 в зависимости от наибольшей общей целевой вероятности. Сравните итоговые средние значения. Какой вариант оказался лучше: два поиска в одной области или по одному в каждой?
Усложняем проект. Вычисление вероятности обнаружения
В реальной поисково-спасательной операции вы оценивали бы ожидаемую вероятность эффективности поиска для каждой области до выполнения самого поиска. Эта ожидаемая, или планируемая, вероятность была бы непосредственно
Усложняем проект. Вычисление вероятности обнаружения 55
связана с прогнозом погоды. К примеру, туман смещается в одну область поиска, в то время как в других будет ясно.
Умножение целевой вероятности на планируемый показатель SEP дает вероятность обнаружения (probability of detection, PoD) для области. Это вероятность того, что объект будет обнаружен с учетом всех известных ошибок и помех.
Напишите версию bayes.py, которая включает случайно генерируемый планируемый SEP для каждой области поиска. Умножьте целевую вероятность для каждой области (например, self.p1, self.p2 или self.p3) на эти новые переменные, чтобы получить PoD для заданной области. К примеру, если целевая вероятность по Байесу для области 3 равна 0.90, а планируемая составляет всего 0.1, то вероятность обнаружения будет 0.09.
Выведите для игрока на экран оболочки целевые вероятности, планируемые SEP и PoD для каждой области, как показано ниже. Теперь игрок сможет использовать эту информацию при принятии решения о дальнейшем поиске.
Текущий поиск 1 Эффективность (E):
E1 = 0.190, E2 = 0.000, E3 = 0.000
Новый планируемый поиск Эффективность и вероятность местонахождения (P) для поиска 2:
E1 = 0.509, E2 = 0.826, E3 = 0.686
P1 = 0.168, P2 = 0.520, P3 = 0.312
Поиск 2
Выберите область поиска:
0 - Выход
1 - Область поиска 1 дважды Вероятность обнаружения: 0.164
2 - Область поиска 2 дважды Вероятность обнаружения: 0.674
3 - Область поиска 3 дважды Вероятность обнаружения: 0.382
4 - Области поиска 1 & 2 Вероятность обнаружения: 0.515
5 - Области поиска 1 & 3 Вероятность обнаружения: 0.3
6 - Области поиска 2 & 3 Вероятность обнаружения: 0.643
7 - Начать заново:
56 Глава 1. Спасение моряков с помощью теоремы Байеса
Для совмещения PoD при поиске в одной области дважды используйте эту формулу:
1 – (1 – PoD)2.
В противном случае суммируйте вероятности.
При вычислении фактического SEP для области ограничьте его ожидаемым значением. При этом будет учитываться общая точность прогнозов погоды, сделанных только на день вперед. Замените метод random.uniform() на распределение, например треугольное, построенное на основе планируемого значения SEP. Список доступных видов распределений можно найти на сайте https://docs. python.org/3/library/random.html#real-valued-distributions. Конечно же, фактический показатель SEP для неисследованной области всегда равен 0.
Как внедрение планируемых SEP влияет на геймплей? Выиграть стало проще или сложнее? Насколько сложнее или проще теперь применять теорему Байеса? Если бы вам довелось руководить реальными поисками, то какое решение вы бы приняли в отношении области с высокой целевой вероятностью, но низким SEP из-за бурного волнения на море? Продолжили бы поиск, отозвали бы операцию или перенесли поиск в область с низкой целевой вероятностью, но лучшими погодными условиями?