Экосистема языка python стремительно развивается. Это уже не просто язык общего назначения. С его помощью можно успешно разрабатывать веб-приложения, системные утилиты и много другое. В этой заметке мы сконцентрируемся все же на другом приложении, а именно на научных вычислениях.
Мы попытаемся найти в языке функции, которые обычно требуем от математических пакетов. Рассмотрим сильные и слабые стороны идеи использования python вместо MATLAB, Maple, Mathcad, Mathematica.
Среда разработки
Код на python может быть помещен в файл с расширением .py и отправлен интерпретатору для выполнения. то классический подход, который обычно разбавляется использованием среды разработки, например pyCharm. Однако, для python (и не только) существует другой способ взаимодействия с интерпретатором — интерактивные блокноты jupyter, сохраняющие промежуточное состояние программы между выполнением различных блоков кода, которые могут быть выполнены в произвольном порядке. Этот способ взаимодействия позаимствован у блокнотов Mathematica, позже аналог появился и в MATLAB (Live script).
Таким образом вся работа с python-кодом переносится в браузер. Получившейся блокнот можно открыть с помощью nbviewer.jupyter.org, github (и gist) умеют самостоятельно показывать содержимое таких файлов (преобразовывать).
Из браузерной природы jupyter следуют его недостатки: отсутствие отладчика и проблемы с печатью большого количества информации (зависание окна браузера). Последняя проблема решается расширением, которое ограничивает максимальное количество символов, которое можно вывести в результате выполнения одной ячейки.
Визуализация данных
Для визуализации данных обычно используется библиотека matplotlib, команды которой очень похожи на MATLABовские. В Stanford'е была разработана библиотека, расширяющая возможности matplotlib — seaborn (необычные графики для статистики).
Рассмотрим пример построения гистограммы для сгенерированной выборки данных.
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
# example data
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, normed=1, facecolor='green', alpha=0.5)
# add a 'best fit' line
y = mlab.normpdf(bins, mu, sigma)
plt.plot(bins, y, 'r--')
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title(r'Histogram of IQ: $mu=100$, $sigma=15$')
# Tweak spacing to prevent clipping of ylabel
plt.subplots_adjust(left=0.15)
plt.show()
Мы видим, что синтаксис matplotlib очень похож на синтаксис MATLAB. Стоит так же заметить, что в заголовке графика используется latex.
Вычислительные математика
Для линейной алгебры в python принято использовать numpy, вектора и матрицы которого типизированы, в отличии от встроенный в язык списков. Для научных вычислений используется библиотека scipy.
Специально для пользователей MATLAB написан гайд по переходу с MATLAB на numpy.
import scipy.integrate as integrate
import scipy.special as special
result = integrate.quad(lambda x: special.jv(2.5,x), 0, 4.5)
В данном примере численно вычисляется значение определенного интеграла функции Бесселя на отрезке [0,0.45] с помощью библиотеки QUADPACK (Fortran).
Символьные вычисления
Для использования символьных вычислений можно использовать библиотеку sympy. Однако, код, написанный с помощью sympy, уступает в красоте коду, написанному на Mathematica, которая специализирована на символьных вычислениях.
# python
from sympy import Symbol, solve
x = Symbol("x")
solve(x**2 - 1)
По функциональности Sympy уступает Mathematica, однако, с учетом ваших потребностей, может оказаться, что для вас их возможности приблизительно равны. Более подробное сравнение можно найти в wiki репозитория sympy.
Ускоряем код
Для ускорения вашего кода за счет преобразования в C++ может быть реализовано по средствам библиотеки theano. Платой за такое ускорение становится синтаксис, теперь вам требуется писать theano-ориентированные функции и указывать типы всех переменных.
import theano
import theano.tensor as T
x = T.dmatrix('x')
s = 1 / (1 + T.exp(-x))
logistic = theano.function([x], s)
logistic([[0, 1], [-1, -2]])
Некоторые библиотеки для сверточных нейронных сетей, такие как Lasagne и Keras, используют theano для своих вычислений. Стоит так же добавить, что theano поддерживает ускорение за счет вычислений на GPU.
Машинное обучение
Самой популярной библиотекой машинного обучения для 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. Загруженные данные представляются в памяти в виде DataFrame'ов, к которым можно применять различные операции: как строчные (построчная обработка), так и групповые (фильтры, группировки). Обзор основных функций pandas можно найти в презентации "Pandas: обзор основных функций" (Автор: Александр Дьяконов, профессор МГУ).
Не все так гладко...
Однако, не все так гладко в python. Например, сейчас уживается две версии языка 2. и 3., обе они развиваются параллельно, однако синтаксис 2ой версии не совместим полностью с синтаксисом 3ей версии.
Еще одна проблема может возникнуть у вас, если вы не обладатель linux, в этом случае при установке ряда библиотек у вас могут возникнуть трудности, некоторые библиотеки будут полностью не совместимы, например tensorflow.
- Jupyter (онлайн блокноты)
- Matplotlib (графики)
- Seaborn (графики)
- Numpy (линейная алгебра)
- Scipy (научные вычисления)
- Sympy (символьные вычисления)
- Theano (преобразование в C++, вычисления на GPU)
- Scikit-learn (машинное обучение)
- Pandas (загрузка данных и простые операции над ними)
P.S: все библиотеки для python, о которых говорилось данной статье, имеют открытый исходный код и распространяются бесплатно. Для их загрузки можно воспользоваться командой pip или просто скачать сборку Anaconda, которая содержит все основные библиотеки.
Автор: bos4r