Целью данного проекта является модернизация библиотеки scikit-learn с целью добавления нового функционала в раздел manifold библиотеки.
Библиотека scikit-learn является одной из самых популярных библиотек машинного обучения, которая используется большим числом специалистов по анализу данных по всему миру. На данный момент в библиотеки реализованы некоторые алгоритмы снижения размерности среди которых есть в том числе и алгоритмы MDS и IsoMap.
Несмотря на большую значимость библиотеки, в нее не входят для некоторых алгоритмов отсутствует возможность построения вложения для точек, не входящих в обучаюющую выборку (построения out-of-sample вложения). Так же в ней нет алгоритмов для получения исходных точек из пространства вложения (reverse out-of-sample).
В рамках решения задачи были использованы следующие технологические решения:
- Встроенные в scikit-learn алгоритмы
- Python 2, Python 3
- Cython 2, Cython 3
Выбор данных технологий обусловлен тем, что задача решается в рамках уже существующей библиотеки с существующими зависимостями.
- Реализовать алгоритм для построения out-of-sample вложения для алгоритмов MDS и IsoMap.
- Реализовать алгоритм reverse out-of-sample для алгоритмов MDS и IsoMap.
Для запуска проекта необходимо выполнить инструкции по сборке проекта с официального сайта scikit-learn. Их можно найти по ссылке и по ссылке на Github.
На практике, для корректной работы тестов и для построения документации, необходимо изменить переменную окружения PYTHONPATH чтобы скрипт сборки использовал библиотеку из локального модифицированного проекта.
Для этого перед сборкой нужно написать (на Linux и Mac OS, на Windows используйте команды, которые специфичны для Windows):
$ export PYTHONPATH=<ПУТЬ ДО ПРОЕКТА>:$PYTHONPATH
В рамках данной контрольной точки был реализован алгоритм построения
вложения Spectral Embedding (sklearn.manifold.SpectralEmbedding
) для точек, которые не входят в обучающую выборку.
Реализован алгоритм вложения для функции близости k-ближайших соседей и для функции RBF (Radial basis function kernel).
Конкретно реализован метод transform
для класса SpectralEmbedding
,
который будет доступен в случае, если конструктору будет передан
параметр include_oos
равный True
, а мера близости (affinity
) равна
k-ближайших или RBF (affinity == 'nearest_neighbors'
или
affinity == 'rbf'
) для солвера собственных векторов arpack
(стандартный солвер).
Аргументы методов передаются в таком же формате, как и в любом другом алгоритме из
пакета sklearn.manifold
.
Пример (построение вложения для точек, сгенерированных из выборки трёхмерной S-кривой):
from sklearn.manifold import SpectralEmbedding
from sklearn.datasets.samples_generator import make_s_curve
# Количество точек для вложения.
SAMPLES_COUNT = 1000
# Состояние случайного генератора, для повторяемости.
RAND_STATE = 1337
# Генерация некоторого распределения для вложения.
# Могло быть использовано и любое другое, характерное для данных,
# распределение.
s_curve, colors = make_s_curve(SAMPLES_COUNT, random_state=RAND_STATE)
# Для того, чтобы иметь возможность строить вложение для новых
# точек, необходимо передать параметр include_oos равный True.
# Если будет передан False, то дополнительных затрат (по сравнению
# с алгоритмом до модификации) не будет.
SE = SpectralEmbedding(n_components=2, include_oos=True)
# Обучение модели (обучение вложения по обучающей выборке).
# Уже было реализовано в библиотеке.
s_curve_embedded = SE.fit_transform(s_curve)
# Построение "Out of Sample" для тех же точек (можно и для других
# точек из того же распределения).
s_curve_oos_embedded = SE.transform(s_curve)
Алгоритм построения вложения был взят из статьи Out-of-Sample Extensions for LLE, Isomap, MDS, Eigenmaps, and Spectral Clustering и был расширен для случая нормированного графа Лапласиана, как это указано в базовой статье алгоритма, уже реализованного в scikit-learn: A Tutorial on Spectral Clustering, 2007 Ulrike von Luxburg (Страница 5, Proposition 3, пункт 2).
-
Добавлен метод inverse_transform для класса SpectralEmbedding, который позволяет отображать точки из пространства сниженной размерности, в пространство исходных векторов.
-
Написана документация к внесённым изменениям (для её сборки необходимо обратиться к инструкции по сборке документации в исходном проекте scikit-learn).