Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.

Снижение размерности данных «швейцарский рулет» и «швейцарский рулет с отверстием»

В этой записной книжке сравниваются два популярных нелинейных метода снижения размерности — стохастическое вложение соседей с t-распределением (t-SNE) и локально-линейное вложение (LLE) — на классическом наборе данных «швейцарский рулет». Затем мы рассмотрим, как они справляются с добавлением отверстия в данных.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Швейцарский рулет

Начнём с генерации набора данных «швейцарский рулет».

import matplotlib.pyplot as plt

from sklearn import datasets, manifold

sr_points, sr_color = datasets.make_swiss_roll(n_samples=1500, random_state=0)

Теперь взглянем на наши данные:

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(
    sr_points[:, 0], sr_points[:, 1], sr_points[:, 2], c=sr_color, s=50, alpha=0.8
)
ax.set_title("Swiss Roll in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)
Swiss Roll in Ambient Space

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

sr_lle, sr_err = manifold.locally_linear_embedding(
    sr_points, n_neighbors=12, n_components=2
)

sr_tsne = manifold.TSNE(n_components=2, perplexity=40, random_state=0).fit_transform(
    sr_points
)

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sr_lle[:, 0], sr_lle[:, 1], c=sr_color)
axs[0].set_title("LLE Embedding of Swiss Roll")
axs[1].scatter(sr_tsne[:, 0], sr_tsne[:, 1], c=sr_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss Roll")
LLE Embedding of Swiss Roll, t-SNE Embedding of Swiss Roll

Примечание

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

Швейцарский рулет с отверстием

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

sh_points, sh_color = datasets.make_swiss_roll(
    n_samples=1500, hole=True, random_state=0
)

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(
    sh_points[:, 0], sh_points[:, 1], sh_points[:, 2], c=sh_color, s=50, alpha=0.8
)
ax.set_title("Swiss-Hole in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)
Swiss-Hole in Ambient Space

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

sh_lle, sh_err = manifold.locally_linear_embedding(
    sh_points, n_neighbors=12, n_components=2
)

sh_tsne = manifold.TSNE(
    n_components=2, perplexity=40, init="random", random_state=0
).fit_transform(sh_points)

fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sh_lle[:, 0], sh_lle[:, 1], c=sh_color)
axs[0].set_title("LLE Embedding of Swiss-Hole")
axs[1].scatter(sh_tsne[:, 0], sh_tsne[:, 1], c=sh_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss-Hole")
LLE Embedding of Swiss-Hole, t-SNE Embedding of Swiss-Hole

Заключительные замечания

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

Мы видим, что, как и в примере «Обучение на многообразиях на рукописных цифрах», t-SNE обычно работает лучше LLE на данных из реального мира.

Общее время выполнения скрипта: (0 минут 18.067 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_swissroll.ipynb

Download Python source code: plot_swissroll.py

Download zipped: plot_swissroll.zip

Связанные примеры

Обучение на многообразиях на рукописных цифрах: локально-линейное вложение, Isomap…

Сравнение методов обучения на многообразиях

Визуализация структуры фондового рынка

Иерархическая кластеризация с учётом структуры и без неё

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/manifold/plot_swissroll.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API