Effectuer un regroupement hiérarchique
Nous allons maintenant effectuer un regroupement hiérarchique sur les jeux de données de démonstration que nous avons chargés dans l'étape 1. Nous utiliserons différentes méthodes de liaison telles que la liaison unique, la liaison moyenne, la liaison complète et la méthode de Ward pour construire nos groupes.
## Configurez les paramètres du regroupement
plt.figure(figsize=(9 * 1.3 + 2, 14.5))
plt.subplots_adjust(
left=0.02, right=0.98, bottom=0.001, top=0.96, wspace=0.05, hspace=0.01
)
plot_num = 1
default_base = {"n_neighbors": 10, "n_clusters": 3}
datasets = [
(noisy_circles, {"n_clusters": 2}),
(noisy_moons, {"n_clusters": 2}),
(varied, {"n_neighbors": 2}),
(aniso, {"n_neighbors": 2}),
(blobs, {}),
(no_structure, {}),
]
for i_dataset, (dataset, algo_params) in enumerate(datasets):
## mettez à jour les paramètres avec des valeurs spécifiques au jeu de données
params = default_base.copy()
params.update(algo_params)
X, y = dataset
## normalisez le jeu de données pour faciliter la sélection des paramètres
X = StandardScaler().fit_transform(X)
## ============
## Créez des objets de regroupement
## ============
ward = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="ward"
)
complete = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="complete"
)
average = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="average"
)
single = cluster.AgglomerativeClustering(
n_clusters=params["n_clusters"], linkage="single"
)
clustering_algorithms = (
("Liaison unique", single),
("Liaison moyenne", average),
("Liaison complète", complete),
("Liaison de Ward", ward),
)
for name, algorithm in clustering_algorithms:
t0 = time.time()
## capturez les avertissements liés à kneighbors_graph
with warnings.catch_warnings():
warnings.filterwarnings(
"ignore",
message="le nombre de composantes connectées de la "
+ "matrice de connectivité est [0-9]{1,2}"
+ " > 1. La complétant pour éviter d'arrêter l'arbre tôt.",
category=UserWarning,
)
algorithm.fit(X)
t1 = time.time()
if hasattr(algorithm, "labels_"):
y_pred = algorithm.labels_.astype(int)
else:
y_pred = algorithm.predict(X)
plt.subplot(len(datasets), len(clustering_algorithms), plot_num)
if i_dataset == 0:
plt.title(name, size=18)
colors = np.array(
list(
islice(
cycle(
[
"#377eb8",
"#ff7f00",
"#4daf4a",
"#f781bf",
"#a65628",
"#984ea3",
"#999999",
"#e41a1c",
"#dede00",
]
),
int(max(y_pred) + 1),
)
)
)
plt.scatter(X[:, 0], X[:, 1], s=10, color=colors[y_pred])
plt.xlim(-2.5, 2.5)
plt.ylim(-2.5, 2.5)
plt.xticks(())
plt.yticks(())
plt.text(
0.99,
0.01,
("%.2fs" % (t1 - t0)).lstrip("0"),
transform=plt.gca().transAxes,
size=15,
horizontalalignment="right",
)
plot_num += 1
plt.show()