Технологии машинного обучения используются во многих отраслях. В этой статье мы поговорим о использовании библиотеки 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)

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

Как видно, мы получили несколько значений, теперь если мы хотим использовать какое‑то конкретное, достаточно выполнить:
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()
Получаем следующий графический вывод:

Преобразуем пространственные данные в частотные
Еще одна полезная функция 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 используются в реальных задачах анализа данных и машинного обучения — приглашаем вас на открытые вебинары: