Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью 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)

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

Вычислив вложения 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")

Заключительные замечания
Отметим, что для t-SNE полезно проверять больше комбинаций параметров. Вероятно, можно было бы получить лучшие результаты, тщательнее настроив эти параметры.
Мы видим, что, как и в примере «Обучение на многообразиях на рукописных цифрах», t-SNE обычно работает лучше LLE на данных из реального мира.
Общее время выполнения скрипта: (0 минут 18.067 секунд)
Связанные примеры
© 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