Примечание
Перейти в конец, чтобы скачать полный код примера или запустить его в браузере с помощью JupyterLite или Binder.
Сравнение методов обучения многообразий
Иллюстрация снижения размерности набора данных с S-образной кривой с помощью различных методов обучения многообразий.
Обсуждение и сравнение этих алгоритмов см. на странице модуля manifold
Похожий пример, в котором методы применяются к набору данных со сферой, см. в разделе Методы обучения многообразий на сфере с разрезом
Обратите внимание: цель MDS — найти низкоразмерное представление данных (в данном случае двумерное), в котором расстояния хорошо соответствуют расстояниям в исходном высокоразмерном пространстве. В отличие от других алгоритмов обучения многообразий, MDS не стремится получить изотропное представление данных в низкоразмерном пространстве.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Подготовка набора данных
Сначала сгенерируем набор данных с S-образной кривой.
import matplotlib.pyplot as plt # unused but required import for doing 3d projections with matplotlib < 3.2 import mpl_toolkits.mplot3d # noqa: F401 from matplotlib import ticker from sklearn import datasets, manifold n_samples = 1500 S_points, S_color = datasets.make_s_curve(n_samples, random_state=0)
Рассмотрим исходные данные. Также определим несколько вспомогательных функций, которые понадобятся нам далее.
def plot_3d(points, points_color, title):
x, y, z = points.T
fig, ax = plt.subplots(
figsize=(6, 6),
facecolor="white",
tight_layout=True,
subplot_kw={"projection": "3d"},
)
fig.suptitle(title, size=16)
col = ax.scatter(x, y, z, c=points_color, s=50, alpha=0.8)
ax.view_init(azim=-60, elev=9)
ax.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax.yaxis.set_major_locator(ticker.MultipleLocator(1))
ax.zaxis.set_major_locator(ticker.MultipleLocator(1))
fig.colorbar(col, ax=ax, orientation="horizontal", shrink=0.6, aspect=60, pad=0.01)
plt.show()
def plot_2d(points, points_color, title):
fig, ax = plt.subplots(figsize=(3, 3), facecolor="white", constrained_layout=True)
fig.suptitle(title, size=16)
add_2d_scatter(ax, points, points_color)
plt.show()
def add_2d_scatter(ax, points, points_color, title=None):
x, y = points.T
ax.scatter(x, y, c=points_color, s=50, alpha=0.8)
ax.set_title(title)
ax.xaxis.set_major_formatter(ticker.NullFormatter())
ax.yaxis.set_major_formatter(ticker.NullFormatter())
plot_3d(S_points, S_color, "Original S-curve samples")

Определение алгоритмов обучения многообразий
Обучение многообразий — это подход к нелинейному снижению размерности. Алгоритмы для решения этой задачи основаны на идее, что размерность многих наборов данных искусственно завышена.
Подробнее см. в руководстве пользователя.
n_neighbors = 12 # neighborhood which is used to recover the locally linear structure n_components = 2 # number of coordinates for the manifold
Локально-линейное встраивание
Локально-линейное встраивание (LLE) можно рассматривать как серию локальных анализов главных компонент, результаты которых затем сравниваются глобально, чтобы найти наилучшее нелинейное встраивание. Подробнее см. в руководстве пользователя.
params = {
"n_neighbors": n_neighbors,
"n_components": n_components,
"eigen_solver": "auto",
"random_state": 0,
}
lle_standard = manifold.LocallyLinearEmbedding(method="standard", **params)
S_standard = lle_standard.fit_transform(S_points)
lle_ltsa = manifold.LocallyLinearEmbedding(method="ltsa", **params)
S_ltsa = lle_ltsa.fit_transform(S_points)
lle_hessian = manifold.LocallyLinearEmbedding(method="hessian", **params)
S_hessian = lle_hessian.fit_transform(S_points)
lle_mod = manifold.LocallyLinearEmbedding(method="modified", **params)
S_mod = lle_mod.fit_transform(S_points)
fig, axs = plt.subplots(
nrows=2, ncols=2, figsize=(7, 7), facecolor="white", constrained_layout=True
)
fig.suptitle("Locally Linear Embeddings", size=16)
lle_methods = [
("Standard locally linear embedding", S_standard),
("Local tangent space alignment", S_ltsa),
("Hessian eigenmap", S_hessian),
("Modified locally linear embedding", S_mod),
]
for ax, method in zip(axs.flat, lle_methods):
name, points = method
add_2d_scatter(ax, points, S_color, name)
plt.show()

Встраивание Isomap
Нелинейное снижение размерности с помощью изометрического отображения. Isomap ищет встраивание в пространство меньшей размерности, сохраняющее геодезические расстояния между всеми точками. Подробнее см. в руководстве пользователя.
isomap = manifold.Isomap(n_neighbors=n_neighbors, n_components=n_components, p=1) S_isomap = isomap.fit_transform(S_points) plot_2d(S_isomap, S_color, "Isomap Embedding")

Многомерное шкалирование
Многомерное шкалирование (MDS) ищет низкоразмерное представление данных, в котором расстояния хорошо соответствуют расстояниям в исходном высокоразмерном пространстве. Подробнее см. в руководстве пользователя.
md_scaling = manifold.MDS(
n_components=n_components,
max_iter=50,
n_init=1,
random_state=0,
init="classical_mds",
normalized_stress=False,
)
S_scaling_metric = md_scaling.fit_transform(S_points)
md_scaling_nonmetric = manifold.MDS(
n_components=n_components,
max_iter=50,
n_init=1,
random_state=0,
normalized_stress=False,
metric_mds=False,
init="classical_mds",
)
S_scaling_nonmetric = md_scaling_nonmetric.fit_transform(S_points)
md_scaling_classical = manifold.ClassicalMDS(n_components=n_components)
S_scaling_classical = md_scaling_classical.fit_transform(S_points)
fig, axs = plt.subplots(
nrows=1, ncols=3, figsize=(7, 3.5), facecolor="white", constrained_layout=True
)
fig.suptitle("Multidimensional scaling", size=16)
mds_methods = [
("Metric MDS", S_scaling_metric),
("Non-metric MDS", S_scaling_nonmetric),
("Classical MDS", S_scaling_classical),
]
for ax, method in zip(axs.flat, mds_methods):
name, points = method
add_2d_scatter(ax, points, S_color, name)
plt.show()

Спектральное встраивание для нелинейного снижения размерности
В этой реализации используется метод собственных отображений лапласиана (Laplacian Eigenmaps), который находит низкоразмерное представление данных с помощью спектрального разложения лапласиана графа. Подробнее см. в руководстве пользователя.
spectral = manifold.SpectralEmbedding(
n_components=n_components, n_neighbors=n_neighbors, random_state=42
)
S_spectral = spectral.fit_transform(S_points)
plot_2d(S_spectral, S_color, "Spectral Embedding")

Стохастическое вложение соседей с t-распределением
Метод преобразует сходства между точками данных в совместные вероятности и пытается минимизировать дивергенцию Кульбака — Лейблера между совместными вероятностями низкоразмерного встраивания и высокоразмерных данных. Целевая функция t-SNE невыпуклая, то есть при разных начальных инициализациях можно получить разные результаты. Подробнее см. в руководстве пользователя.
t_sne = manifold.TSNE(
n_components=n_components,
perplexity=30,
init="random",
max_iter=250,
random_state=0,
)
S_t_sne = t_sne.fit_transform(S_points)
plot_2d(S_t_sne, S_color, "T-distributed Stochastic \n Neighbor Embedding")

Общее время выполнения скрипта: (0 минут 18.855 секунд)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/manifold/plot_compare_methods.html