Примечание
Перейти к концу для скачивания полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder
Свисающая лента и лента с отверстием: Редукция
Этот ноутбук стремится сравнить два популярных нелинейных метода уменьшения размерности, встраивание стохастических соседей с распределением Т (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 минут 20,165 секунд)
Похожие примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/manifold/plot_swissroll.html