Экосистема языка 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, которая содержит все основные библиотеки.
Комментарии (30)
Saffron
11.10.2016 20:49А бывает блокнот для питона командно-строчный? А то, куда не глянешь — сплошной веб интерфейс.
chersanya
12.10.2016 11:07Есть qtconsole, близко к командной строке. В терминале нельзя реализовать все возможности jupyter notebook — а именно графики, интерактивные виджеты, рендер latex и т.п. В qtconsole тоже кстати далеко не всё есть из этого.
hudson
11.10.2016 22:43+2> Еще одна проблема может возникнуть у вас, если вы не обладатель linux
Такие проблемы легко решаются при помощи VirtualBox, Vagrant или Docker. А вот проблемы, связанные с сегментацией языка и его библиотек, увы так просто не решаются =(madfly
12.10.2016 09:54+1А из VirtualBox можно дотянуться до GPU?
hudson
12.10.2016 10:17Интересный вопрос — есть на примете простой сниппет для проверки? Хочу попробовать.
Вообще говоря, хардварное 3D ускорение есть в том же Virtualbox. А с докером немного сложнее. Сам докер использует ресурсы хоста, т.е. вроде бы ответ да — может дотянуться и до GPU. НО! В Windows он выполняется внутри виртуального Hyper-X контейнера. Так что может быть что и не может.
iroln
12.10.2016 13:45Нельзя. Пока что только NVidia GRID, но, сами понимаете, обычному пользователю не по карману, и амазоновский инстанс тоже не дешёвый.
Saffron
12.10.2016 15:16Конечно: https://www.virtualbox.org/manual/ch09.html#pcipassthrough
KVM тоже работает с iommu.
Так что можете спокойно ставить линукс и пробрасывать видеокарту для винды по надобности.madfly
12.10.2016 16:52Хотелось-то спокойно пробрасывать карту из уже поставленной винды в гостевой линукс. Потому что проблемы с библиотеками именно под виндой. И для поддержки iommu мне придётся проц сначала проапгрейдить…
Saffron
12.10.2016 19:56Не нужно апргейдится. Винда не поддерживает iommu. Винда вообще очень плохо поддерживает железо. Когда может — заставляет производителей поддерживать. Они строчат гигантские костыли, которые вторгаются в действие ОС на нескольких уровней. Но когда надо проапгрейдить архитектуру ОС для поддержки принципиально новых фич — майкрософт умывает руки.
Pencroff
11.10.2016 23:55+2Однако, не все так гладко в python. Например, сейчас уживается две версии языка 2. и 3., обе они развиваются параллельно, однако синтаксис 2ой версии не совместим полностью с синтаксисом 3ей версии.
Мне кажеться что это не проблема потому что большинство библиотек (в т.ч. и перечисленные Вами) поддерживают как 2-ю так и 3-ю версии. А так же существуют программы такие как
2to3
.
PilotNet
12.10.2016 10:56А c помощью чего можно получить код C++ код который будет пользоваться библиотеками например scipy?
chersanya
12.10.2016 11:05+1Насчёт C++ не уверен, но в некотором смысле близко к этому можно подойти взяв cython например. А зачем именно, кстати? Функции в scipy обычно нетривиальные, то есть вычисления в них занимают намного больше времени, чем оверхед от вызова функций в питоне — поэтому здесь вряд ли что-то ускорится от использования C++.
chersanya
12.10.2016 11:03+1две версии языка 2. и 3., обе они развиваются параллельно
Может я что-то упустил, но разве 2.х развивается? Насколько я знаю, выходят только багфиксы. Если кто сейчас начинает смотреть в сторону питона, то вряд ли берут версию 2 — уже много времени прошло, давно не помню никаких проблем что не было библиотеки под третий питон.LionisIAm
12.10.2016 17:54По-моему, достаточно много примеров, обучающих видео в сети написано/показывают 2. версии. И установив 3., например, для обучения, с большой долей вероятности ошибки будут указывать на переход к более ранней версии.
prasl
12.10.2016 11:27Спасибо за информацию! Получается — с помощью данных инструментов возможно сколотить программку для решения задач по сопромату и т.п.?
mpetrunin
12.10.2016 12:30+1Разумно упомянуть Sage, раз уж вы заговорили про математику и python.
Цитата из википедии:
Система компьютерной алгебры, покрывающая много областей математики, включая алгебру, комбинаторику, вычислительную математику и матанализ.
В числе прочего, Sage построено на базе большого числа мат. пакетов:
It builds on top of many existing open-source packages: NumPy, SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, R and many more.
Кроме того, есть биндинги к закрытым системам компьютерной алгебры типа Magma.
AndreWin
13.10.2016 19:40Лучше Sagemathcloud. Удобнее и больше возможностей. Его с недавних пор можно с помощью Docker локально поставить.
enabokov
12.10.2016 12:55+1Кому интересен Jupyter, может начать его изучение с курса Математика и Python для анализа данных.
В начале 00-х, будучу студентом, я делал вычисления в Mathematica. Недавно я увидел Jupyter и подумал: «ё-моё, это же Mathematica, только с вменяемым языком, открытая, бесплатная и в тёплом ламповом вебе!».
iroln
12.10.2016 13:50Для ускорения вашего кода за счет преобразования в C++ может быть реализовано по средствам библиотеки theano. Платой за такое ускорение становится синтаксис, теперь вам требуется писать theano-ориентированные функции и указывать типы всех переменных.
А как же numba? Theano всё же для другого предназначен.
ElvinFox
От себя бы добавил проект Rodeo
Он очень сильно напоминает R studio, совмещает удобства python и R, при этом достаточно активно развивается.
kxx
Мне больше spyder понравился.
mpetrunin
В эту же степь тот же Sage, который я упомянул ниже. Он также имеет интерфейс взаимодействия с R.