Tracer l'agglomération hiérarchique

Machine LearningMachine LearningBeginner
Pratiquer maintenant

This tutorial is from open-source community. Access the source code

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Le regroupement agglomératif est un algorithme de regroupement hiérarchique qui regroupe des points de données similaires. Il commence par chaque point de données comme un regroupement séparé puis combine ces regroupements de manière itérative en fonction de leur similarité jusqu'à ce que tous les points de données appartiennent à un seul regroupement. Dans ce laboratoire, nous allons explorer l'effet de l'imposition d'un graphe de connectivité pour capturer la structure locale dans les données.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session et nous résoudrons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49062{{"Tracer l'agglomération hiérarchique"}} sklearn/cluster -.-> lab-49062{{"Tracer l'agglomération hiérarchique"}} ml/sklearn -.-> lab-49062{{"Tracer l'agglomération hiérarchique"}} end

Importation des bibliothèques requises

Nous allons commencer par importer les bibliothèques requises, y compris numpy, matplotlib et sklearn.

import time
import matplotlib.pyplot as plt
import numpy as np

from sklearn.cluster import AgglomerativeClustering
from sklearn.neighbors import kneighbors_graph

Générer des données d'échantillonnage

Nous générons des données d'échantillonnage en créant une onde sinusoïdale avec du bruit aléatoire.

n_samples = 1500
np.random.seed(0)
t = 1.5 * np.pi * (1 + 3 * np.random.rand(1, n_samples))
x = t * np.cos(t)
y = t * np.sin(t)

X = np.concatenate((x, y))
X += 0.7 * np.random.randn(2, n_samples)
X = X.T

Créer un graphe

Crée un graphe capturant la connectivité locale. Un nombre plus élevé de voisins donnera des grappes plus homogènes au détriment du temps de calcul. Un nombre très élevé de voisins donne des tailles de grappe plus uniformément réparties mais peut ne pas imposer la structure manifold locale des données.

knn_graph = kneighbors_graph(X, 30, include_self=False)

Visualiser le regroupement sans connectivité

Visualisez le regroupement sans connectivité en traçant les points de données avec des couleurs différentes.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=None, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "liaison=%s\n(temps %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivité=%r"
            % (n_clusters, False),
            size=17,
        )

plt.show()

Visualiser le regroupement avec connectivité

Visualisez le regroupement avec connectivité en traçant les points de données avec des couleurs différentes.

for n_clusters in (30, 3):
    plt.figure(figsize=(10, 4))
    for index, linkage in enumerate(("average", "complete", "ward", "single")):
        plt.subplot(1, 4, index + 1)
        model = AgglomerativeClustering(
            linkage=linkage, connectivity=knn_graph, n_clusters=n_clusters
        )
        t0 = time.time()
        model.fit(X)
        elapsed_time = time.time() - t0
        plt.scatter(X[:, 0], X[:, 1], c=model.labels_, cmap=plt.cm.nipy_spectral)
        plt.title(
            "liaison=%s\n(temps %.2fs)" % (linkage, elapsed_time),
            fontdict=dict(verticalalignment="top"),
        )
        plt.axis("equal")
        plt.axis("off")

        plt.subplots_adjust(bottom=0, top=0.83, wspace=0, left=0, right=1)
        plt.suptitle(
            "n_cluster=%i, connectivité=%r"
            % (n_clusters, True),
            size=17,
        )

plt.show()

Sommaire

Dans ce laboratoire, nous avons exploré l'effet de l'imposition d'un graphe de connectivité pour capturer la structure locale dans les données en utilisant l'Agglomération hiérarchique. Nous avons visualisé le regroupement avec et sans connectivité et avons observé que l'utilisation d'un graphe de connectivité peut conduire à des grappes plus stables et significatives. Nous avons également observé qu'un nombre plus élevé de voisins conduit à des grappes plus homogènes au détriment du temps de calcul.