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

Поделиться с друзьями
-->

Комментарии (30)


  1. ElvinFox
    11.10.2016 17:57
    +1

    От себя бы добавил проект Rodeo
    Он очень сильно напоминает R studio, совмещает удобства python и R, при этом достаточно активно развивается.


    1. kxx
      12.10.2016 00:53
      +2

      Мне больше spyder понравился.


    1. mpetrunin
      12.10.2016 12:32
      +1

      В эту же степь тот же Sage, который я упомянул ниже. Он также имеет интерфейс взаимодействия с R.


  1. Saffron
    11.10.2016 20:49

    А бывает блокнот для питона командно-строчный? А то, куда не глянешь — сплошной веб интерфейс.


    1. bos4r
      11.10.2016 21:30

      Для этого до есть ipython.


      1. Tihon_V
        12.10.2016 10:54

        bpython/bpython3 — если не нужна поддержка шрифтов mathjax/textlive-*.
        Хотя если речь о научных вычеслениях, то всё таки — нужна.


    1. chersanya
      12.10.2016 11:07

      Есть qtconsole, близко к командной строке. В терминале нельзя реализовать все возможности jupyter notebook — а именно графики, интерактивные виджеты, рендер latex и т.п. В qtconsole тоже кстати далеко не всё есть из этого.


  1. hudson
    11.10.2016 22:43
    +2

    > Еще одна проблема может возникнуть у вас, если вы не обладатель linux

    Такие проблемы легко решаются при помощи VirtualBox, Vagrant или Docker. А вот проблемы, связанные с сегментацией языка и его библиотек, увы так просто не решаются =(


    1. madfly
      12.10.2016 09:54
      +1

      А из VirtualBox можно дотянуться до GPU?


      1. hudson
        12.10.2016 10:17

        Интересный вопрос — есть на примете простой сниппет для проверки? Хочу попробовать.

        Вообще говоря, хардварное 3D ускорение есть в том же Virtualbox. А с докером немного сложнее. Сам докер использует ресурсы хоста, т.е. вроде бы ответ да — может дотянуться и до GPU. НО! В Windows он выполняется внутри виртуального Hyper-X контейнера. Так что может быть что и не может.


        1. PashaPodolsky
          12.10.2016 11:21

          Простой сниппет — попробуйте установить CUDA внутри VirtualBox.


        1. skeeph
          12.10.2016 17:54

          Nvidia-Docker позволяет использовать gpu внутри контейнера на linux хостах


          1. hudson
            12.10.2016 18:00

            Doker это действительно умеет, Nvidia-docker наверное включает предустановленный CUDA, но речь тут шла о Windows, и в этом случае Docker работает внутри виртуальной машины…


      1. iroln
        12.10.2016 13:45

        Нельзя. Пока что только NVidia GRID, но, сами понимаете, обычному пользователю не по карману, и амазоновский инстанс тоже не дешёвый.


      1. Saffron
        12.10.2016 15:16

        Конечно: https://www.virtualbox.org/manual/ch09.html#pcipassthrough
        KVM тоже работает с iommu.

        Так что можете спокойно ставить линукс и пробрасывать видеокарту для винды по надобности.


        1. mpetrunin
          12.10.2016 16:14

          Вам это лично удавалось? Я пытался пробросить в VirtualBox — не завелось.


          Завелось только с QEMU/KVM.


          1. Saffron
            12.10.2016 16:19

            Нет, я пользуюсь KVM. А поставить два гипервизора одновременно нельзя — ядро отторгает.


        1. madfly
          12.10.2016 16:52

          Хотелось-то спокойно пробрасывать карту из уже поставленной винды в гостевой линукс. Потому что проблемы с библиотеками именно под виндой. И для поддержки iommu мне придётся проц сначала проапгрейдить…


          1. Saffron
            12.10.2016 19:56

            Не нужно апргейдится. Винда не поддерживает iommu. Винда вообще очень плохо поддерживает железо. Когда может — заставляет производителей поддерживать. Они строчат гигантские костыли, которые вторгаются в действие ОС на нескольких уровней. Но когда надо проапгрейдить архитектуру ОС для поддержки принципиально новых фич — майкрософт умывает руки.


  1. Pencroff
    11.10.2016 23:55
    +2

    Однако, не все так гладко в python. Например, сейчас уживается две версии языка 2. и 3., обе они развиваются параллельно, однако синтаксис 2ой версии не совместим полностью с синтаксисом 3ей версии.

    Мне кажеться что это не проблема потому что большинство библиотек (в т.ч. и перечисленные Вами) поддерживают как 2-ю так и 3-ю версии. А так же существуют программы такие как 2to3.


  1. PilotNet
    12.10.2016 10:56

    А c помощью чего можно получить код C++ код который будет пользоваться библиотеками например scipy?


    1. chersanya
      12.10.2016 11:05
      +1

      Насчёт C++ не уверен, но в некотором смысле близко к этому можно подойти взяв cython например. А зачем именно, кстати? Функции в scipy обычно нетривиальные, то есть вычисления в них занимают намного больше времени, чем оверхед от вызова функций в питоне — поэтому здесь вряд ли что-то ускорится от использования C++.


      1. PilotNet
        12.10.2016 19:18

        Мне odepack из с++ пускать надо


  1. chersanya
    12.10.2016 11:03
    +1

    две версии языка 2. и 3., обе они развиваются параллельно

    Может я что-то упустил, но разве 2.х развивается? Насколько я знаю, выходят только багфиксы. Если кто сейчас начинает смотреть в сторону питона, то вряд ли берут версию 2 — уже много времени прошло, давно не помню никаких проблем что не было библиотеки под третий питон.


    1. LionisIAm
      12.10.2016 17:54

      По-моему, достаточно много примеров, обучающих видео в сети написано/показывают 2. версии. И установив 3., например, для обучения, с большой долей вероятности ошибки будут указывать на переход к более ранней версии.


  1. prasl
    12.10.2016 11:27

    Спасибо за информацию! Получается — с помощью данных инструментов возможно сколотить программку для решения задач по сопромату и т.п.?


  1. 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.


    1. AndreWin
      13.10.2016 19:40

      Лучше Sagemathcloud. Удобнее и больше возможностей. Его с недавних пор можно с помощью Docker локально поставить.


  1. enabokov
    12.10.2016 12:55
    +1

    Кому интересен Jupyter, может начать его изучение с курса Математика и Python для анализа данных.
    В начале 00-х, будучу студентом, я делал вычисления в Mathematica. Недавно я увидел Jupyter и подумал: «ё-моё, это же Mathematica, только с вменяемым языком, открытая, бесплатная и в тёплом ламповом вебе!».


  1. iroln
    12.10.2016 13:50

    Для ускорения вашего кода за счет преобразования в C++ может быть реализовано по средствам библиотеки theano. Платой за такое ускорение становится синтаксис, теперь вам требуется писать theano-ориентированные функции и указывать типы всех переменных.

    А как же numba? Theano всё же для другого предназначен.