Comment travailler avec le clustering dans Python

Comment travailler avec le clustering dans Python

Aspose.PDF FOSS pour Python regroupe un petit utilitaire de clustering hiérarchique agglomératif à usage général — indépendant de toute opération PDF unique — permettant de regrouper des objets DataPoint liés en instances Cluster et de calculer le centroïde d’un cluster. Vous décidez ce que représente chaque point de donnée et fournissez vous-même ses coordonnées; l’utilitaire ne les remplit pas automatiquement. La bibliothèque s’installe avec la commande ci-dessous.

Guide étape par étape

Étape 1: Installer le paquet

Installez le paquet FOSS Aspose.PDF:

git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .

Vérifiez l’installation en important Cluster et en affichant un message de confirmation:

from aspose_pdf import Cluster
print("aspose-pdf-foss-for-python is ready.")

Étape 2: Importer les classes requises

Importez les trois classes qui composent l’utilitaire de clustering:

from aspose_pdf import Cluster, ClusterCollection, DataPoint

Étape 3: Créer des points de données

Un DataPoint associe une chaîne name à une liste value de flottants — les coordonnées ou le vecteur de caractéristiques que vous décidez être pertinents pour votre propre logique de regroupement:

from aspose_pdf import DataPoint

point_a = DataPoint("item-1", [12.0, 45.0])
point_b = DataPoint("item-2", [13.5, 44.0])
point_c = DataPoint("item-3", [98.0, 5.0])

print(point_a.name, point_a.value)

DataPoint n’associe pas value à un concept PDF particulier — les coordonnées de page, les métriques de police ou tout autre vecteur de caractéristiques numériques fonctionnent tous aussi bien.


Étape 4: Regrouper les points de données en un cluster

Passez la liste complète des membres au constructeur Cluster. Il n’existe aucune méthode pour ajouter des éléments à un Cluster après sa création, donc décidez de l’appartenance d’abord:

from aspose_pdf import Cluster

nearby = Cluster([point_a, point_b])
print(nearby.count)              # 2
print(nearby.contains(point_a))  # True

contains() correspond par égalité — DataPoint définit l’égalité sur name et value ensemble, de sorte qu’une autre instance DataPoint avec le même nom et la même valeur est également signalée comme contenue.


Étape 5: Calculer le centroïde du Cluster

DataPoint.get_centroid(cluster) est une méthode statique qui moyenne chaque dimension de chaque DataPoint.value du cluster et renvoie le résultat sous la forme d’un nouveau DataPoint nommé "centroid":

from aspose_pdf import DataPoint

centroid = DataPoint.get_centroid(nearby)
print(centroid.name)   # "centroid"
print(centroid.value)  # per-dimension average across the cluster

Chaque liste DataPoint.value du cluster doit avoir la même longueur — get_centroid moyenne position par position et ne valide pas que les longueurs correspondent. L’appeler sur Cluster.empty(), ou sur tout cluster contenant count == 0, déclenche ValueError.


Étape 6: Cloner un Cluster ou réutiliser l’instance vide partagée

clone() renvoie un Cluster indépendant contenant les mêmes éléments; Cluster.empty() renvoie toujours la même instance de cluster vide mise en cache plutôt que d’en allouer une nouvelle:

from aspose_pdf import Cluster

backup = nearby.clone()
print(backup is nearby)          # False -- independent copy
print(backup.contains(point_a))  # True -- same items

placeholder = Cluster.empty()
print(placeholder.count)         # 0

Étape 7: Regrouper plusieurs Clusters dans un ClusterCollection

ClusterCollection regroupe plusieurs objets Cluster derrière un seul conteneur compatible len():

from aspose_pdf import Cluster, ClusterCollection

outliers = Cluster([point_c])
collection = ClusterCollection([nearby, outliers])
print(len(collection))  # 2

ClusterCollection n’expose pas de méthode pour récupérer ses clusters — conservez une référence à la liste que vous passez au constructeur si vous devez parcourir les clusters par la suite.

Problèmes courants et solutions

Il n’existe aucune méthode pour ajouter un élément à un existant Cluster

Cluster n’accepte sa liste d’adhésion qu’au moment de la construction (Cluster(items)). Créez d’abord la liste complète d’objets DataPoint, puis construisez le Cluster — il n’existe aucun add() ou append() à appeler par la suite.

DataPoint.get_centroid() raises ValueError

Cette situation se produit lorsque le cluster fourni est vide (count == 0), y compris Cluster.empty(). Vérifiez cluster.count avant d’appeler get_centroid, ou gérez l’exception si un cluster vide est une entrée valide dans votre flux de travail.

Les valeurs du centroïde semblent incorrectes

get_centroid additionne chaque position DataPoint.value une par une et divise par le nombre de points — il ne vérifie pas que chaque liste value du cluster ait la même longueur. Mélanger des objets DataPoint de dimensionalité différente produit une moyenne incorrecte en silence plutôt que de lever une exception.

Expecting Cluster.empty() pour créer un nouveau cluster vide à chaque fois

Cluster.empty() est un accesseur singleton — chaque appel renvoie la même instance mise en cache. Utilisez Cluster() (sans arguments) à la place si vous avez besoin d’un cluster vide distinct et indépendant.

Attendre que la bibliothèque regroupe automatiquement les points

DataPoint, Cluster et ClusterCollection sont des structures de données pour représenter des points, des clusters et un calcul de centroïde — le module ne comprend pas de fonction de liaison ou de distance qui décide quels points appartiennent ensemble. Votre propre code détermine l’appartenance aux clusters avant de construire un Cluster.

Questions fréquentes

Ce module regroupe-t-il automatiquement les points de données par distance?

Non. Cluster, DataPoint et ClusterCollection sont des blocs de construction pour représenter des groupements déjà déterminés et calculer un centroïde — il n’existe aucune agrégation intégrée ni étape d’affectation basée sur la distance.

Quelle est la différence entre Cluster() et Cluster.empty()?

Cluster(items=None) crée une nouvelle instance à chaque appel. Cluster.empty() est une classmethod qui renvoie la même instance de cluster vide mise en cache et partagée à chaque appel.

Puis-je ajouter des éléments à un Cluster après l’avoir créé ?

Non. Cluster n’expose que contains(), clone() et la propriété count au-delà de la construction — l’appartenance est fixe une fois le constructeur exécuté.

Est-ce que get_centroid() fonctionne avec n’importe quel nombre de dimensions ?

Oui, tant que chaque liste DataPoint.value dans le cluster a la même longueur. get_centroid moyenne chaque dimension indépendamment et renvoie le résultat sous la forme d’un nouveau DataPoint.

Qu’est-ce que ClusterCollection ajoute par rapport à une simple liste Python de clusters ?

Principalement un conteneur typé avec prise en charge de len(). Il n’ajoute pas d’itération, de recherche ou de comportement de fusion au-delà de ce que vous avez déjà dans la liste à partir de laquelle vous l’avez construit.

Voir aussi

 Français