Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Неважно, чем вы занимаетесь - большими данными, машинным обучением, компьютерной графикой или криптографией - без математики вам не обойтись! Везде сейчас требуются базовые знания и понимание алгоритмов. Практические примеры позволят легко разобраться с самыми необходимыми математическими понятиями. 300 упражнений и мини-проектов откроют вам новые возможности в освоении интересных и популярных IT-профессий. Вы познакомитесь с базовыми библиотеками Python, используемыми при разработке реальных приложений, и вспомните давно забытые основы линейной алгебры и матана.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 832
Veröffentlichungsjahr: 2023
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчик А. Киселев
Пол Орланд
Математические алгоритмы для программистов. 3D-графика, машинное обучение и моделирование на Python . — СПб.: Питер, 2023.
ISBN 978-5-4461-2287-5
© ООО Издательство "Питер", 2023
Все права защищены. Никакая часть данной книги не может быть воспроизведена в какой бы то ни было форме без письменного разрешения владельцев авторских прав.
Посвящается папе — моему первому учителю математики и информатики.
Я работал над этой книгой около трех лет. За эти годы я получил помощь от многих людей, и поэтому у меня очень длинный список тех, кого я хотел бы поблагодарить.
Прежде всего, я благодарен издательству Manning за помощь в подготовке этой книги. Они поверили, что я, начинающий автор, смогу написать эту большую и сложную книгу, и проявили большое терпение, так как работа над ней не раз отставала от графика. В частности, хочу сказать спасибо Марьян Бейс (Marjan Bace) и Майклу Стивенсу (Michael Stephens) за продвижение проекта и за то, что помогли определить, каким он должен быть. Мой первоначальный редактор-консультант Ричард Уоттенбергер (Richard Wattenbarger) тоже сыграл ключевую роль в создании книги, помогая снова и снова уточнять содержание. Он просмотрел шесть черновых вариантов глав 1 и 2, прежде чем мы решили, как будет структурировано издание.
Большую часть книги я написал в 2019 году под чутким руководством моего второго редактора Дженнифер Стаут (Jennifer Stout), которая довела проект до финишной черты и многому научила меня в области написания технических книг. Научный редактор Крис Ати (Kris Athi) и рецензент Майк Шепард (Mike Shepard) прошли с нами весь путь. Они внимательно вычитали каждое слово и каждую строку кода и исправили бесчисленное количество ошибок. Немалую помощь в работе мне оказала Микаэла Леунг (Michaela Leung), которая проверила всю книгу на предмет грамотности и технической точности. Я также хотел бы поблагодарить маркетинговую команду Manning. Благодаря программе раннего доступа к книгам MEAP (Manning Early Access Program) мы смогли убедиться, что эта книга будет интересна людям. Знание того, что она будет иметь хотя бы скромный коммерческий успех, стало отличным мотиватором на заключительных напряженных этапах ее подготовки к публикации.
Мои нынешние и бывшие коллеги из Tachyus многому научили меня в программировании, и часть их уроков вошли в эту книгу. Я благодарю Джека Фокса (Jack Fox) за то, что он первым заставил меня задуматься о связи между функциональным программированием и математикой, о которой рассказывается в главах 4 и 5. Уилл Смит (Will Smith) учил меня проектированию видеоигр, и у нас состоялось множество содержательных дискуссий о векторной геометрии для отображения трехмерных сцен. Стелиос Кириаку (Stelios Kyriacou) научил меня почти всему, что я знаю об алгоритмах оптимизации, и помог отладить часть кода из книги. Он также познакомил меня с философией, согласно которой «любая задача является задачей оптимизации»— ее обсуждением мы займемся во второй половине книги.
Спасибо всем рецензентам: Адиру Рамджиавану (Adhir Ramjiawan), Анто Аравинту (Anto Aravinth), Кристоферу Хаупту (Christopher Haupt), Клайву Харберу (Clive Harber), Дэну Шейху (Dan Sheikh), Дэвиду Онгу (David Ong), Дэвиду Тримму (David Trimm), Эмануэлю Пиччинелли (Emanuele Piccinelli), Федерико Бертолуччи (Federico Bertolucci), Фрэнсису Буонтемпо (Frances Buontempo), Герману Гонсалесу-Моррису (German Gonzalez-Morris), Джеймсу Ньике (James Nyika), Йенсу Кристиану Б. Медсену (Jens Christian B. Madsen), Йоханнесу ван Неймегену (Johannes Van Nimwegen), Джонни Хопкинсу (Johnny Hopkins), Джошуа Хорвицу (Joshua Horwitz), Хуану Руфесу (Juan Rufes), Кеннету Фрикласу (Kenneth Fricklas), Лоуренсу Джиглио (Laurence Giglio), Натану Мише (Nathan Mische), Филипу Бесту (Philip Best), Река Хорвату (Reka Horvath), Роберту Уолшу (Robert Walsh), Себастьену Портебуа (Sébastien Portebois), Стефано Палуэлло (Stefano Paluello) и Винсенту Жу (Vincent Zhu). Ваши замечания и предложения помогли сделать эту книгу лучше.
Я не эксперт по машинному обучению, поэтому обращался к множеству источников, чтобы убедиться, что представил его точно и правильно. Больше всего на меня повлиял курс Эндрю Ына (Andrew Ng) Machine Learning на Coursera и серия Deep Learning от 3Blue1Brown на YouTube. Это отличные ресурсы, и если вы обращались к ним, то заметите, как они повлияли на подачу сведений в трети книги. Я также должен поблагодарить Дэна Рэтбоуна (Dan Rathbone), чей веб-сайт CarGraph.com был источником данных для многих моих примеров.
Я также хочу сказать спасибо своей супруге Маргарет, астроному, за то что познакомила меня с блокнотами Jupyter. Перенос примеров кода для этой книги в блокноты Jupyter значительно упростил их опробование. Мои родители тоже оказали значительную поддержку, когда я писал книгу: несколько раз случалось так, что я пытался закончить очередную главу во время праздничного визита к ним. Еще они лично гарантировали, что я обязательно продам хотя бы один экземпляр (спасибо, мама!).
Наконец, эта книга посвящена моему папе, который первым показал мне, как реализуется математика в программном коде, обучая меня программированию на APL, когда я учился в пятом классе. Если выйдет второе издание, я мог бы заручиться его помощью, чтобы переписать весь код на Python одной строкой на APL!
Книга научит вас решать математические задачи с помощью программного кода на языке Python. Математические навыки становятся все более важными для профессиональных разработчиков программного обеспечения, особенно в связи с тем, что компании комплектуют команды, занимающиеся исследованием данных и машинным обучением. Математика играет важнейшую роль и в других областях, таких как разработка игр, компьютерная графика и анимация, обработка изображений и сигналов, система ценообразования и анализ фондового рынка.
Мы начнем с введения в двух- и трехмерную векторную геометрию, векторные пространства, линейные преобразования и матрицы, составляющие основу линейной алгебры. В части II будут представлены численные методы с упором на наиболее полезные для программистов темы: производные, градиенты, метод Эйлера и символьные вычисления. Наконец, в части III все перечисленное ранее собирается вместе, чтобы показать, как работают некоторые важные алгоритмы машинного обучения. К последней главе книги вы будете знать математику на достаточном уровне, чтобы написать собственную нейронную сеть с нуля.
Но имейте в виду, это не учебник! Цель книги — дать адаптированное введение в темы, которые могут показаться пугающими, запутанными или скучными. В каждой главе демонстрируется пример практического применения математической концепции, дополненный упражнениями, которые помогут проверить, как вы поняли материал, а также мини-проектами, которые помогут продолжить исследование.
Издание адресовано всем, кто имеет значительный опыт программирования и хочет освежить свои знания по математике или узнать больше о ее применении в программном обеспечении. Для этого не требуется разбираться в матанализе или линейной алгебре — достаточно знания алгебры и геометрии на уровне средней школы, даже если вы ее давно окончили. Эта книга предназначена для чтения за клавиатурой. Наибольшую пользу от нее вы получите, если будете выполнять представленные в ней примеры и упражнения.
Глава 1 приглашает вас в мир математики. Она охватывает некоторые важные области применения этой науки в программировании, знакомит с темами, которые будут обсуждаться в книге, и объясняет, насколько полезным инструментом может быть программирование для изучающих математику. Далее книга делится на три части.
• Часть I посвящена векторам и линейной алгебре.
• Глава 2 посвящена векторной математике в двухмерном пространстве с упором на использование координат в двухмерной графике. Здесь же рассматриваются некоторые основы тригонометрии.
• Глава 3 дополняет предыдущую обсуждением трехмерных пространств, точки которых имеют три координаты. Здесь будут представлены понятия скалярного и векторного произведений, которые можно применять для измерения углов и отображения трехмерных моделей.
• Глава 4 знакомит с линейными преобразованиями — функциями, принимающими и возвращающими векторы, которые создают определенные геометрические эффекты, такие как поворот или отражение.
• Глава 5 знакомит с матрицами — массивами чисел, которые могут кодировать линейное векторное преобразование.
• Глава 6 обобщает принципы операций с двух- и трехмерными векторами до произвольного числа измерений. Пространства таких векторов называют векторными пространствами. В качестве основного примера в ней используется обработка изображения с помощью векторной математики.
• Глава 7 посвящена наиболее важной вычислительной задаче линейной алгебры — решению систем линейных уравнений. Здесь она задействуется в системе обнаружения столкновений в простой видеоигре.
• Часть II знакомит с численными методами и примерами их применения в физике.
• Глава 8 вводит понятие скорости изменения функции. Она охватывает производные, определяющие скорость изменения функции, и интегралы, позволяющие восстановить функцию по скорости ее изменения.
• В главе 9 рассматривается важный метод приближенного интегрирования, называемый методом Эйлера. Здесь игра, представленная в главе 7, будет дополнена движущимися и ускоряющимися объектами.
• Глава 10 демонстрирует приемы манипулирования алгебраическими выражениями в коде, включая автоматический поиск формулы производной функции. Здесь вы познакомитесь с символьным программированием — подходом к выполнению математических операций в коде, отличным от подходов, используемых в других частях книги.
• Глава 11 расширяет тему вычислительных методов до двух измерений, определяя операцию градиента и показывая пример определения силового поля с ее помощью.
• Глава 12 демонстрирует применение производных для поиска максимальных или минимальных значений функций.
• Глава 13 показывает возможность представления звуковых волн в виде функций и их разложения на суммы других, более простых функций, называемых рядами Фурье. Здесь рассказывается, как реализовать на Python воспроизведение музыкальных нот и аккордов.
• Часть III объединяет приемы из первых двух частей для представления некоторых важных принципов машинного обучения.
• Глава 14 рассказывает, как методом линейной регрессии аппроксимировать двухмерные данные прямой линией. Примером в этой главе служит поиск функции, которая наиболее точно предсказывает цену подержанного автомобиля по его пробегу.
• Глава 15 рассматривает другую задачу машинного обучения — определение модели автомобиля на основе некоторых данных о нем. Выяснение того, какой объект представлен точкой данных, называется классификацией.
• Глава 16 показывает, как спроектировать и реализовать нейронную сеть — особый вид математической функции — и использовать ее для классификации изображений. В этой главе применяется то, что рассматривалось почти во всех предыдущих главах.
Каждая глава должна быть понятна, если вы прочитали и поняли предыдущие главы. Необходимость описания идей в определенном порядке обусловлена тем, что они могут иметь самые разные практические применения. Надеюсь, что разнообразие примеров сделает чтение книги увлекательным занятием и покажет вам широкий спектр практических применений математики.
В этой книге темы представлены (я надеюсь) в логическом порядке. Концепции, описанные в главе 2, используются как основа в главе 3, на тех, что рассмотрены в главах 2 и 3, базируется глава 4 и т.д. Программный код не всегда пишется по порядку. То есть самые простые концепции в готовой компьютерной программе не всегда находятся в первых строках первого файла исходного кода. Это различие затрудняет представление исходного кода книги в понятной форме.
Я попытался решить эту проблему за счет включения в каждую главу пошагового файла с кодом в виде блокнота Jupyter. Блокнот Jupyter можно считать аналогом записи интерактивного сеанса Python со встроенными визуальными элементами, такими как графики и изображения. Используя блокнот Jupyter, вы вводите какой-то код, выполняете его, а позже переопределяете в ходе сеанса по мере реализации своих идей. Блокнот для каждой главы включает код для каждого раздела и подраздела, который выполняется в том же порядке, что и в книге. Это означает, что вы можете опробовать примеры во время чтения. Вам не нужно добираться до конца главы, где код станет достаточно полным для выполнения. В приложении A показано, как настроить Python и Jupyter, а в приложении Б перечислены некоторые функции Python, полезные для начинающих изучать этот язык.
Эта книга содержит множество примеров исходного кода как в отдельных листингах, так и прямо внутри текста. В обоих случаях исходный код оформлен моношириннымшрифтом, чтобы его легко было отличить от обычного текста.
Кроме того, комментарии, имеющиеся в исходном коде, удалены из листингов, если они описываются в тексте. Многие листинги сопровождаются отдельными описаниями, подчеркивающими наиболее важные понятия. Если в исходном коде в репозитории книги будут обнаружены и исправлены какие-то ошибки, то там же, в репозитории, я добавлю примечания, объясняющие любые отличия от кода, напечатанного в книге.
В некоторых случаях примерами служат целые сценарии на Python, а не ячейки в блокноте Jupyter. Эти сценарии можно запускать в командной строке, например, командой pythonscript.py, или в ячейке блокнота Jupyter командой !pythonscript.py. Я включил ссылки на такие сценарии в некоторые блокноты Jupyter, чтобы в процессе чтения вы могли находить и опробовать соответствующие файлы с исходным кодом.
На протяжении всей книги я неизменно придерживаюсь одного соглашения: примеры выполнения отдельных команд Python начинаются с приглашения к вводу >>>, которое используется также в интерактивной оболочке Python. Я настоятельно рекомендую применять Jupyter вместо интерактивной оболочки Python, но в любом случае строки, начинающиеся с >>>, — это ввод, а остальные строки — вывод. Вот пример блока кода, представляющего вычисление выражения «2 + 2» в интерактивной оболочке Python:
>>> 2 + 2
4
В следующем примере отсутствует последовательность символов >>>, так что этот пример содержит обычный код на Python, а не последовательность ввода и вывода:
def square(x):
return x * x
В книге приводятся сотни упражнений для закрепления пройденного материала, а также мини-проекты — либо более сложные, либо требующие более творческого подхода, либо знакомящие с новыми понятиями. Большинство упражнений и мини-проектов предлагают решить некоторые математические задачи с использованием кода на Python. Я дал решения почти всех, кроме некоторых мини-проектов, реализация которых не ограничивается временными рамками. Решения приводятся в блокноте Jupyter для соответствующей главы.
Код примеров из этой книги доступен для загрузки на веб-сайте издательства Manning (https://www.manning.com/books/math-for-programmers), а также в репозитории GitHub (https://github.com/orlandpm/math-for-programmers).
Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.
Пол Орланд (Paul Orland) — предприниматель, программист и математик-энтузиаст. Поработав инженером-программистом в Microsoft, он основал компанию Tachyus, занимающуюся прогностической аналитикой в сфере оптимизации производства энергии в нефтегазовой отрасли. Как технический директор и основатель Tachyus, Пол руководил разработкой программного обеспечения для машинного обучения и моделирования физических процессов, а позже, как генеральный директор, расширил сферу влияния компании, найдя клиентов на пяти континентах. Пол имеет степень бакалавра по математике, полученную в Йельском университете, и степень магистра по физике, полученную в Вашингтонском университете. Его тотемное животное — лобстер.
На обложку книги помещена иллюстрация, подписанная Femme Laponne — женщина из Лапландии, ныне Сапми, которая включает части северной Норвегии, Швеции, Финляндии и России. Иллюстрация взята из каталога костюмов жителей разных стран, изданного Жаком Грассе де Сен-Совером (Jacques Grasset de Saint-Sauveur; 1757–1810) в 1797 году во Франции под названием Costumes de Différents Pays. Все иллюстрации в каталоге тщательно прорисованы и раскрашены вручную. Богатое разнообразие коллекции Грассе де Сен-Совера напоминает нам о том, насколько отличными друг от друга были культурные традиции городов и регионов мира всего 200 лет назад. Изолированные друг от друга люди говорили на разных диалектах и языках. Встретив человека на улице, по его одежде легко было определить, где он живет, чем зарабатывает на жизнь или какое положение в обществе занимает.
С тех пор стиль одежды сильно изменился, исчезло разнообразие, характеризующее различные области и страны. В настоящее время трудно различить по одежде даже жителей разных континентов, не говоря уже о жителях разных городов, регионов или стран. Мы заменили культурное многообразие более разнообразной личной жизнью и, безусловно, более разнообразной и интересной интеллектуальной жизнью.
Мы в издательстве Manning славим изобретательность и предприимчивость компьютерного бизнеса обложками книг, изображающими богатство региональных различий двухвековой давности, оживших благодаря иллюстрациям Грассе де Сен-Совера.
В первой части этой книги мы углубимся в область математики, которая называется линейной алгеброй. Линейная алгебра — это раздел математики, связанный с вычислениями на многомерных данных. Понятие «размерность» — геометрическое, вы наверняка интуитивно понимаете, что я имею в виду, когда говорю, что квадрат — двухмерная фигура, а куб — трехмерная. Кроме всего прочего, линейная алгебра позволяет превратить геометрические идеи мерности в нечто, что можно вычислить конкретно.
Базовая концепция линейной алгебры — это вектор, который можно представить как точку в некотором многомерном пространстве. Например, вы наверняка слышали в школе о двухмерной координатной плоскости. Как будет говориться в главе 2, двухмерные векторы соответствуют точкам на плоскости и их можно представить упорядоченными парами чисел (x, y). В главе 3 мы рассмотрим трехмерное пространство, векторы (точки) в котором представлены тройками чисел (x, y, z). В обоих случаях можно использовать наборы векторов для определения геометрических фигур, из которых в свою очередь можно скомпоновать интересные графические изображения.
Еще одно ключевое понятие линейной алгебры — линейное преобразование, с которым мы познакомимся в главе 4. Линейное преобразование — это своего рода функция, которая принимает на входе вектор и возвращает на выходе вектор, сохраняя при этом геометрию (в особом смысле) задействованных векторов. Например, если набор векторов (точек) лежит на прямой в двухмерном пространстве, то после линейного преобразования они так и останутся на одной прямой. В главе 5 мы введем понятие матриц — прямоугольных массивов чисел, которые могут выражать линейные преобразования. Кульминацией изучения линейных преобразований станет их последовательное применение к трехмерной графике в программе на Python для создания анимационного эффекта.
Изобразить мы можем только двух- и трехмерные векторы и линейные преобразования, но можем определить векторы с любым количеством измерений. В n-мерном пространстве вектор определяется упорядоченным набором из n чисел (x1, x2, …, xn). В главе 6 мы воспользуемся концепциями двух- и трехмерного пространства, чтобы определить обобщенную идею векторного пространства и более конкретное понятие размерности. В частности, увидим, что можно рассматривать цифровые изображения, состоящие из пикселов, как векторы в многомерном векторном пространстве и манипулировать этими изображениями с помощью линейных преобразований.
Наконец, в главе 7 исследуем самый распространенный вычислительный инструмент линейной алгебры — решение систем линейных уравнений. Как вы, возможно, помните из школьного курса алгебры, решение двух линейных уравнений с двумя переменными x и y сообщает нам координаты точки пересечения двух линий на плоскости. В общем случае решение системы линейных уравнений сообщает координаты пересечения линий, плоскостей и обобщений более высокой мерности в векторном пространстве. Имея возможность автоматически решать такие задачи на Python, мы будем использовать ее для создания первой версии движка видеоигры.