Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Различные варианты агломеративной кластеризации на двумерном представлении цифр
Пример различных вариантов связи для агломеративной кластеризации на двумерном представлении набора данных с цифрами.
Цель этого примера — интуитивно показать поведение метрик, а не найти хорошие кластеры для цифр. Именно поэтому в примере используется двумерное представление.
Этот пример показывает поведение «богатые становятся богаче» при агломеративной кластеризации, которая склонна создавать кластеры неравномерного размера.
Это поведение особенно выражено при стратегии средней связи, в результате которой образуется несколько кластеров с небольшим количеством точек данных.
Случай одиночной связи ещё более патологичен: один очень большой кластер охватывает большинство цифр, кластер среднего размера (чистый) содержит большинство нулей, а все остальные кластеры образованы шумовыми точками по краям.
Другие стратегии связи приводят к более равномерному распределению кластеров, которые поэтому, вероятно, будут менее чувствительны к случайной повторной выборке набора данных.
Computing embedding Done. ward : 0.06s average : 0.06s complete : 0.05s single : 0.02s
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
from time import time
import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets, manifold
digits = datasets.load_digits()
X, y = digits.data, digits.target
n_samples, n_features = X.shape
np.random.seed(0)
# ----------------------------------------------------------------------
# Visualize the clustering
def plot_clustering(X_red, labels, title=None):
x_min, x_max = np.min(X_red, axis=0), np.max(X_red, axis=0)
X_red = (X_red - x_min) / (x_max - x_min)
plt.figure(figsize=(6, 4))
for digit in digits.target_names:
plt.scatter(
*X_red[y == digit].T,
marker=f"${digit}$",
s=50,
c=plt.cm.nipy_spectral(labels[y == digit] / 10),
alpha=0.5,
)
plt.xticks([])
plt.yticks([])
if title is not None:
plt.title(title, size=17)
plt.axis("off")
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
# ----------------------------------------------------------------------
# 2D embedding of the digits dataset
print("Computing embedding")
X_red = manifold.SpectralEmbedding(n_components=2).fit_transform(X)
print("Done.")
from sklearn.cluster import AgglomerativeClustering
for linkage in ("ward", "average", "complete", "single"):
clustering = AgglomerativeClustering(linkage=linkage, n_clusters=10)
t0 = time()
clustering.fit(X_red)
print("%s :\t%.2fs" % (linkage, time() - t0))
plot_clustering(X_red, clustering.labels_, "%s linkage" % linkage)
plt.show()
Общее время выполнения скрипта: (0 минут 1.396 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/cluster/plot_digits_linkage.html



