Многообразиевое обучение на сферических данных

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Советы по использованию ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Ноутбук, чтобы приступить к практике с использованием Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/UtilitiesandDatasetsGroup -.-> sklearn/utils("Utilities") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/utils -.-> lab-49208{{"Многообразиевое обучение на сферических данных"}} ml/sklearn -.-> lab-49208{{"Многообразиевое обучение на сферических данных"}} end

Импорт библиотек

Начнем с импорта необходимых библиотек. Будем использовать scikit-learn, matplotlib и numpy.

from time import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
from sklearn import manifold
from sklearn.utils import check_random_state

import mpl_toolkits.mplot3d

Создание сферообразного набора данных

Далее мы создадим сферообразный набор данных. Создадим сферу, отделим полюса и сделаем тонкий срез по ее стороне. Это позволит методам многообразиевое обучения «распространить ее», проектируя на два измерения.

n_neighbors = 10
n_samples = 1000

random_state = check_random_state(0)
p = random_state.rand(n_samples) * (2 * np.pi - 0.55)
t = random_state.rand(n_samples) * np.pi

indices = (t < (np.pi - (np.pi / 8))) & (t > ((np.pi / 8)))
colors = p[indices]
x, y, z = (
    np.sin(t[indices]) * np.cos(p[indices]),
    np.sin(t[indices]) * np.sin(p[indices]),
    np.cos(t[indices]),
)

fig = plt.figure(figsize=(15, 8))
plt.suptitle(
    "Manifold Learning with %i points, %i neighbors" % (1000, n_neighbors), fontsize=14
)

ax = fig.add_subplot(251, projection="3d")
ax.scatter(x, y, z, c=p[indices], cmap=plt.cm.rainbow)
ax.view_init(40, -10)

sphere_data = np.array([x, y, z]).T

Выполнить многообразиевое обучение с использованием локально-линейного вложения

Теперь мы выполним многообразиевое обучение с использованием локально-линейного вложения (Locally Linear Embedding, LLE). LLE - это мощный метод, который позволяет раскрывать сложные многообразия с небольшим количеством образцов. Мы будем использовать четыре варианта LLE и сравнить их результаты.

methods = ["standard", "ltsa", "hessian", "modified"]
labels = ["LLE", "LTSA", "Hessian LLE", "Modified LLE"]

for i, method in enumerate(methods):
    t0 = time()
    trans_data = (
        manifold.LocallyLinearEmbedding(
            n_neighbors=n_neighbors, n_components=2, method=method
        )
     .fit_transform(sphere_data)
     .T
    )
    t1 = time()
    print("%s: %.2g sec" % (methods[i], t1 - t0))

    ax = fig.add_subplot(252 + i)
    plt.scatter(trans_data[0], trans_data[1], c=colors, cmap=plt.cm.rainbow)
    plt.title("%s (%.2g sec)" % (labels[i], t1 - t0))
    ax.xaxis.set_major_formatter(NullFormatter())
    ax.yaxis.set_major_formatter(NullFormatter())
    plt.axis("tight")

Выполнить многообразиевое обучение с использованием Isomap

Далее мы выполним многообразиевое обучение с использованием Isomap. Isomap - это нелинейный метод понижения размерности, который ищет вложение данных в более низко-мерное пространство, сохраняющее геодезические расстояния между всеми парами точек.

t0 = time()
trans_data = (
    manifold.Isomap(n_neighbors=n_neighbors, n_components=2)
  .fit_transform(sphere_data)
  .T
)
t1 = time()
print("%s: %.2g sec" % ("ISO", t1 - t0))

ax = fig.add_subplot(257)
plt.scatter(trans_data[0], trans_data[1], c=colors, cmap=plt.cm.rainbow)
plt.title("%s (%.2g sec)" % ("Isomap", t1 - t0))
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.axis("tight")

Выполнить многомерное масштабирование (MDS)

Теперь мы выполним многомерное масштабирование (Multi-dimensional Scaling, MDS) в многообразиевое обучение. MDS - это метод, который ищет низко-мерное представление данных, в котором расстояния между точками соответствуют расстояниям в исходном высокомерном пространстве.

t0 = time()
mds = manifold.MDS(2, max_iter=100, n_init=1, normalized_stress="auto")
trans_data = mds.fit_transform(sphere_data).T
t1 = time()
print("MDS: %.2g sec" % (t1 - t0))

ax = fig.add_subplot(258)
plt.scatter(trans_data[0], trans_data[1], c=colors, cmap=plt.cm.rainbow)
plt.title("MDS (%.2g sec)" % (t1 - t0))
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.axis("tight")

Выполнить спектральное вложение

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

t0 = time()
se = manifold.SpectralEmbedding(n_components=2, n_neighbors=n_neighbors)
trans_data = se.fit_transform(sphere_data).T
t1 = time()
print("Spectral Embedding: %.2g sec" % (t1 - t0))

ax = fig.add_subplot(259)
plt.scatter(trans_data[0], trans_data[1], c=colors, cmap=plt.cm.rainbow)
plt.title("Spectral Embedding (%.2g sec)" % (t1 - t0))
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.axis("tight")

Выполнить t-распределенное стохастическое вложение соседей (t-SNE)

Наконец, мы выполним многообразиевое обучение с использованием t-распределенного стохастического вложения соседей (t-SNE). t-SNE - это метод, который ищет низко-мерное представление данных, которое сохраняет локальные расстояния между точками.

t0 = time()
tsne = manifold.TSNE(n_components=2, random_state=0)
trans_data = tsne.fit_transform(sphere_data).T
t1 = time()
print("t-SNE: %.2g sec" % (t1 - t0))

ax = fig.add_subplot(2, 5, 10)
plt.scatter(trans_data[0], trans_data[1], c=colors, cmap=plt.cm.rainbow)
plt.title("t-SNE (%.2g sec)" % (t1 - t0))
ax.xaxis.set_major_formatter(NullFormatter())
ax.yaxis.set_major_formatter(NullFormatter())
plt.axis("tight")

plt.show()

Резюме

В этом практическом занятии мы применили различные методы многообразиевое обучение к сферообразному набоору данных. Мы использовали Locally Linear Embedding (LLE), Isomap, Multi-dimensional Scaling (MDS), Spectral Embedding и t-distributed Stochastic Neighbor Embedding (t-SNE), чтобы получить некоторое представление о методах многообразиевое обучение. Эти методы полезны для анализа и визуализации высокомерных данных.