Pull to refresh

Python для математических вычислений. Опыт Марка Андреева

Level of difficulty Easy
Reading time 4 min
Views 86K

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


Мы попытаемся найти в языке функции, которые обычно требуем от математических пакетов. Рассмотрим сильные и слабые стороны идеи использования python вместо MATLAB, Maple, Mathcad, Mathematica.


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


Код на python может быть помещен в файл с расширением .py и отправлен интерпретатору для выполнения. то классический подход, который обычно разбавляется использованием среды разработки, например pyCharm. Однако, для python (и не только) существует другой способ взаимодействия с интерпретатором — интерактивные блокноты jupyter, сохраняющие промежуточное состояние программы между выполнением различных блоков кода, которые могут быть выполнены в произвольном порядке. Этот способ взаимодействия позаимствован у блокнотов Mathematica, позже аналог появился и в MATLAB (Live script).



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


Из браузерной природы 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, которая содержит все основные библиотеки.




Марк Андреев

Tags:
Hubs:
+19
Comments 30
Comments Comments 30

Articles