Знакомимся с SciPy

Технологии машинного обучения используются во многих отраслях. В этой статье мы поговорим о использовании библиотеки SciPy при выполнении научных и технических вычислений.

SciPy — это бесплатная библиотека Python с открытым исходным кодом, используемая для различных вычислений, в том числе и для задач Machine Learning. Различные модули библиотеки позволяют оптимизировать алгоритмы, интегрировать, использовать линейную алгебру или обрабатывать сигналы. Кроме того, SciPy можно интегрировать с другими инструментами, такими как Matplotlib для визуализации данных.

По сути, SciPy представляет собой набор математических алгоритмов и различных полезных функций, построенных на основе расширениях NumPy языка Python. Она значительно расширяет возможности интерактивной сессии Python, предоставляя пользователю функции и классы для манипулирования и визуализации данных.

Здесь у читателя, хорошо знакомого с темой машинного обучения на Python может возникнуть резонный вопрос: чем SciPy отличается от распространенной библиотеки NumPy.

Да, и SciPy и NumPy — это основные библиотеки, предлагающие широкий спектр функций и методов на Python. Однако между ними есть несколько различий, так к примеру, SciPy предлагает больше деталей при выполнении вычислений. Также, она позволяет выполнять более сложные математические операции, такие как численные алгоритмы и алгебраические функции. С другой стороны, Numpy больше ориентирована на сортировку, индексацию и упорядочивание данных.

Скорость вычислений в NumPy выше, поскольку он основан на языке C. SciPy, с другой стороны, написана на языке Python и поэтому обеспечивает меньшую скорость, но более функциональна.

Также будучи библиотекой, основанной на функциях, SciPy не использует концепцию массивов, в отличии от Numpy, которая позволяет строить многомерные массивы объектов, содержащих однотипные данные.

Установка SciPy

Установить эту библиотеку достаточно просто с помощью менеджера пакетов pip. Просто выполните следующую команду в терминале:

pip install scipy  

После успешной установки давайте посмотрим, какие математические задачи позволяет решать данный инструмент.

Что входит в состав SciPy

В состав библиотеки SciPy входит множество различных пакетов, реализующие разнообразный математический функционал. Рассмотрим основные пакеты и состава библиотеки.

Пакет scipy.constants представляет собой набор физических и математических констант, которые можно использовать в своих вычислениях. Если при расчетах нам потребуется преобразование Фурье, то можно воспользоваться пакетом scipy.fftpack. Кластерные алгоритмы для векторного квантования находятся в пакете scipy.cluster.

Если вы забыли что‑то из линейной алгебры, которой так любят мучать в вузах, то вам пригодится пакет scipy.linalg. Функции для интерполяции и интегрирования находятся в пакетах scipy.interpolation и scipy.integrate соответственно.

Для работы с разреженными матрицами пригодится пакет scipy.sparse, а для пространственных структур и алгоритмов — scipy.spatial.

Это далеко не полный список тех пакетов, которые входят в состав SciPy. Далее мы рассмотрим несколько примеров работы с некоторыми из этих пакетов.

Константы SciPy

Существует множество констант, которые включены в пакет scipy.constant. Преимущественно, эти константы используются при работе в общей научной области. Давайте посмотрим, как импортируются и используются эти константные переменные.

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

import scipy

print("sciPy -golden ratio  Value = %.18f"%scipy.constants.golden)
cb209446bb849020bfd5cc53448a90e5.png

Таким образом, мы импортировали и распечатали константу золотого сечения с помощью SciPy.В пакете scipy.constant, также есть функция find (), которая возвращает список ключей physical_constant, содержащих заданную строку.

В следующем примере мы попробуем в SciPy поискать константы Больцмана (физическая константа, определяющая связь между температурой и тепловой энергией микрочастиц вещества):

from scipy.constants import find  

find('boltzmann')
f41efa620fc97d324124838f127b5156.png

Как видно, мы получили несколько значений, теперь если мы хотим использовать какое‑то конкретное, достаточно выполнить:

scipy.constants.physical_constants['Boltzmann constant in Hz/K']

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

Начнем с кластеризации.

Кластеризация в SciPy

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

В качестве примера работы с кластерами в SciPy мы рассмотрим, как реализовать алгоритм K‑means, который является одним из самых популярных алгоритмов кластеризации. Алгоритм K‑means корректирует классификацию наблюдений в кластеры и обновляет центроиды (среднее арифметическое всех точек) кластеров до тех пор, пока их положение не станет стабильным в течение последовательных итераций.

В примере ниже мы с помощью NumPy сгенерировали два набора случайных точек. После объединения этих наборов мы отбеливаем данные. Отбеливание данных — это метод предварительной обработки, который удаляет корреляцию или зависимости между признаками в наборе данных. По сути, отбеливание нормализует данные и является важным шагом перед использованием кластеризации k‑means. В завершении, мы используем функцию kmeans и передаем ей данные и количество кластеров, которые мы хотим получить.

import numpy as np
from scipy.cluster.vq import  kmeans, whiten
import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style("darkgrid")

# Создаем 50 точек в двух кластерах a и b

pts = 100
a = np.random.multivariate_normal([0, 0], 
                                  [[4, 1], [1, 4]], 
                                  size=pts)
b = np.random.multivariate_normal([30, 10],
                                  [[10, 2], [2, 1]],
                                  size=pts)
features = np.concatenate((a, b))

# Отбеливаем данные
whitened = whiten(features)
# Find 2 clusters in the data
codebook, distortion = kmeans(whitened, 2)

# Рисуем графики
plt.scatter(whitened[:, 0], whitened[:, 1])
plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
plt.show()

Получаем следующий графический вывод:

138ee12c2b0cdb0b7b57057294091433.png

Преобразуем пространственные данные в частотные

Еще одна полезная функция SciPy Это Fast Fourier Transformation — математическая техника, которая используется для преобразования пространственных данных в частотные.

SciPy предоставляет модуль fftpack, который используется для вычисления преобразования Фурье. В примере ниже мы построим график простой периодической функции sin и посмотрим, как функция scipy.fft преобразует ее.

from matplotlib import pyplot as plt
import numpy as np 
import seaborn as sns

sns.set_style("darkgrid")
#Частота в Герцах

fre  = 10

fre_samp = 100
t = np.linspace(0, 2, 2 * fre_samp, endpoint = False )
a = np.sin(fre   2  np.pi * t)
plt.plot(t, a)
plt.xlabel('Time (s)')
plt.ylabel('Signal amplitude')
plt.show()

В результате работы данного кода получим следующий вывод:

Теперь используем функцию fftpack для того, чтобы выполнить преобразование Фурье:

from scipy import fftpack

A = fftpack.fft(a)
frequency = fftpack.fftfreq(len(a)) * fre_samp
plt.stem(frequency, np.abs(A),use_line_collection=True)
plt.xlabel('Frequency in Hz')
plt.ylabel('Frequency Spectrum Magnitude')
plt.show()

Этот пакет предоставляет нам такие функции, как fftfreq (), которая генерирует частоты дискретизации. Также функция fftpack.dct () позволяет вычислить дискретное косинусное преобразование (DCT).

Заключение

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

Если вы хотите углубить знания и посмотреть, как прикладные инструменты Python используются в реальных задачах анализа данных и машинного обучения — приглашаем вас на открытые вебинары:

  • 28 апреля — Unsupervised подходы: Сегментация временных рядов.
    Подробнее

  • 28 апреля — Подготовка данных в Pandas.
    Подробнее

  • 12 мая — Модели матричной факторизации: теория и практика.
    Подробнее

Habrahabr.ru прочитано 6102 раза