Примечание
Перейти к концу для загрузки полного кода примера. или для запуска этого примера в вашем браузере через JupyterLite или Binder
Иерархическое кластерирование: структурированное против неструктурированного метода Уорда
Пример создаёт набор данных «швейцарский рулон» и выполняет иерархическое кластерирование по их положению.
Для получения дополнительной информации см. Иерархическое кластерирование.
На первом шаге иерархическое кластерирование выполняется без ограничений связности на структуру и основано только на расстоянии, а на втором шаге кластеризация ограничена графом k-ближайших соседей: это иерархическое кластерирование со структурированным приоритетом.
Некоторые из кластеров, полученных без ограничений связности, не учитывают структуру «швейцарского рулона» и простираются через разные складки многообразий. Напротив, при наложении ограничений связности кластеры образуют красивое разбиение «швейцарского рулона».
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause import time as time # The following import is required # for 3D projection to work with matplotlib < 3.2 import mpl_toolkits.mplot3d # noqa: F401 import numpy as np
Генерация данных
Мы начинаем с генерации набора данных «швейцарский рулон».
from sklearn.datasets import make_swiss_roll n_samples = 1500 noise = 0.05 X, _ = make_swiss_roll(n_samples, noise=noise) # Make it thinner X[:, 1] *= 0.5
Вычисление кластеризации
Мы выполняем AgglomerativeClustering, которое относится к иерархическому кластерированию без каких-либо ограничений связности.
from sklearn.cluster import AgglomerativeClustering
print("Compute unstructured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print(f"Elapsed time: {elapsed_time:.2f}s")
print(f"Number of points: {label.size}")
Compute unstructured hierarchical clustering... Elapsed time: 0.04s Number of points: 1500
Вывод результата
Отображение неструктурированных иерархических кластеров.
import matplotlib.pyplot as plt
fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
ax1.set_position([0, 0, 0.95, 1])
for l in np.unique(label):
ax1.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
_ = fig1.suptitle(f"Without connectivity constraints (time {elapsed_time:.2f}s)")

Определяем k-ближайших соседей с 10 соседями
from sklearn.neighbors import kneighbors_graph connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
Вычисление кластеризации
Мы снова выполняем AgglomerativeClustering с ограничениями связности.
print("Compute structured hierarchical clustering...")
st = time.time()
ward = AgglomerativeClustering(
n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
elapsed_time = time.time() - st
label = ward.labels_
print(f"Elapsed time: {elapsed_time:.2f}s")
print(f"Number of points: {label.size}")
Compute structured hierarchical clustering... Elapsed time: 0.06s Number of points: 1500
Вывод результата
Отображение структурированных иерархических кластеров.
fig2 = plt.figure()
ax2 = fig2.add_subplot(121, projection="3d", elev=7, azim=-80)
ax2.set_position([0, 0, 0.95, 1])
for l in np.unique(label):
ax2.scatter(
X[label == l, 0],
X[label == l, 1],
X[label == l, 2],
color=plt.cm.jet(float(l) / np.max(label + 1)),
s=20,
edgecolor="k",
)
fig2.suptitle(f"With connectivity constraints (time {elapsed_time:.2f}s)")
plt.show()

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