python
September 3, 2019

Математические вычисления в Python

Вместо введения.

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

Многие студенты и научные работники для своих задач пользуются такими пакетами как MATLAB, Maple, Mathcad, Mathematica. В этом плане Python ничуть не уступает этим языкам, а в чем то даже превосходит их.

Среда разработки.

Обычно код на Python помещают в файл с расширением .py и с целью его дальнейшей отправки интерпретатору для выполнения. В таком подходе вы также можете использовать среду разработки, например PyCharm, либо текстовый редактор, например Sublime Text. Для последнего, кстати, существует еше и удобный способ взаимодействия с системой git — Sublime Merge.

Однако, для Python (кстати, и не только для него) существует другой способ взаимодействия с интерпретатором — интерактивные блокноты jupyter, сохраняющие промежуточное состояние программы между выполнением различных блоков кода, которые могут быть выполнены в произвольном порядке.

Этот удобный способ взаимодействия позаимствован у блокнотов Mathematica, позже аналог появился и в MATLAB (Live script).
На картинке изображен странный аттрактор Лоренца.

Таким образом вся работа с Python-кодом переносится в браузер. Получившейся блокнот можно открыть с помощью nbviewer.jupyter.org. К тому же, github (и gist) умеют самостоятельно показывать содержимое таких файлов (преобразовывать).

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

Визуализация данных.

Для визуализации данных чаще всего используется библиотека matplotlib. В Стэнфорде была разработана библиотека, расширяющая возможности matplotlib — seaborn. Чаще всего эту библиотеку используют для работы со статистикой, при анализе данных.

Некоторые возможности Matplotlib

Рассмотрим пример построения гистограммы для сгенерированной выборки данных.

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

mu = 100 # mean of distribution
sigma = 15 # standard deviation of distribution
x = mu + sigma * np.random.randn(10000)
num_bins = 50

# the histogram of the data
n, bins, patches = plt.hist(x, num_bins, density=1, facecolor='green', alpha=0.5)

# add a 'best fit' line
y = norm.pdf(bins, mu, sigma)

plt.plot(bins, y, 'r--')
plt.xlabel('Bins')
plt.ylabel('Probability')
plt.title(r'Histogram: $\mu=100$, $\sigma=15#39;)
plt.subplots_adjust(left=0.15)
plt.show()
Гистограмма
Обратите внимание, что мы можем использовать разметку latex в заголовке графика.

Вычислительная математика.

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

Функции в каждом модуле SciPy хорошо задокументированы во внутренних докстрингах и в официальной документации. Большинство из них непосредственно предоставляет функции для работы с числовыми алгоритмами и они очень просты в использовании. Таким образом, scipy может сократить гигантское количество времени в научных вычислениях, т.к. он обеспечивает уже написанные и тестированные функции. Ниже я приведу краткое описание модулей и их возможностей.

scipy.constants — Набор математических и физических констант.

scipy.special — Много специальных функций для математической физики, такие как: Эйри, эллиптические, Бесселя, гамма, бета, гипергеометрические, параболического цилиндра, Матьё, шаровидной волны, Струве, Кельвина.

scipy.integrate — Функции для работы с численным интегрированием используя методы трапеции, Симпсона, Ромберга и другие. Также предоставляет методы для работы с полными дифференциальными уравнениями.

scipy.optimize — Стандартные методы поиска максимума/минимума для работы с обобщенными пользовательскими функциями. Включенные алгоритмы: Нелдера — Мида, Поулла ( Powell's), сопряженных градиентов, Бройдена — Флетчера — Гольдфарба — Шанно, наименьших квадратов, условной оптимизации, имитации отжига, полного перебора, Брента, Ньютона, бисекции, Бройдена, Андерсона и линейного поиска.

scipy.linalg — Более широкий функционал для работы с линейной алгеброй чем в NumPy. Предоставляет больше возможностей для использования специальных и быстрых функций, для специфических объектов (Например: трёхдиагональная матрица). Включенные методы: поиск невырожденной матрицы, поиск определителя, решение линейных систем уравнений, расчета норм и псевдообратной матрицы, спектрального разложения, сингулярного разложения, LU-разложения, разложения Холецкого, QR-разложения, разложения Шура и много других математических операций для работы с матрицами.

scipy.sparse — Функции для работы с большими разреженными матрицами.

scipy.interpolate — Методы и классы для интерполяции объектов, которые могут быть использованы для дискретных числовых данных. Линейная и сплайновая (математическое представление плавных кривых) интерполяция доступна для одно- и двух-мерных наборов данных.

scipy.fftpack — Методы для обработки преобразований Фурье.

scipy.signal — Методы для обработки сигналов, например: свертка функций, корреляция, дискретное преобразование Фурье, сглаживающий B-сплайн, фильтрация, и т.д.

scipy.stats — Большая библиотека статистических функций и распределений для работы с наборами данных.

Небольшой пример (взятие определенного интеграла от функции Бесселя первого рода):

import scipy.integrate as integrate
import scipy.special as special

result = integrate.quad(lambda x: special.jv(2.5,x), 0, 4.5)

Символьные вычисления.

Для использования символьных вычислений можно использовать библиотеку sympy. Однако, код, написанный с помощью sympy, уступает в красоте коду, написанному на Mathematica, которая специализирована на символьных вычислениях.

from sympy import Symbol, solve

x = Symbol("x")
solve(x**2 - 1)
То же самое, но на математике.

Разумеется, sympy уступает математике по функциональности, однако, с учетом ваших потребностей, может оказаться, что sympy это достойная замена математике (которая, к слову, еще требует наличие лицензии).

Кстати, очень удобно использовать sympy вместе с jupyter. Тем более, sympy имеет открытый исходный код и абсолютно бесплатен.
Более подробное сравнение можно найти в wiki репозитория sympy.
Ни в коем случае не отговариваю от использования Mathematica. Это отличный пакет. В ряде задач ее использование обусловлено простотой и быстротой решения.

Машинное обучение

Самой простой библиотекой машинного обучения на Python является scikit-learn. Эта библиотека содержит все основные алгоритмы машинного обучения, включая метрики качества, инструменты для валидации алгоритмов, инструменты для предварительной обработки данных.

from sklearn import svm
from sklearn import datasets

clf = svm.SVC()
iris = datasets.load_iris()

X, y = iris.data, iris.target

clf.fit(X, y)  
clf.predict(X)

Для загрузки данных из различных форматов данных (excel, csv) обычно используется pandas. Кстати, еще его используют для анализа данных. Статью о Pandas для новичков, кстати, можете посмотреть вот тут.

Загруженные данные представляются в памяти в формате Series/DataFrame, к которым можно применять различные операции, например построчная обработка, либо групповые операции (фильтры, группировки).

Все библиотеки для Python, о которых говорилось выше, имеют открытый исходный код и распространяются бесплатно. Для их загрузки можно воспользоваться командой pip в терминале или просто скачать сборку Anaconda, которая содержит все основные библиотеки.
Если вы используете Python именно для научных вычислений, то советую к ней еще скачать Spyder. Это специальная IDE, которая довольно удобна.

Статья подготовлена и написана для канала Hello World.