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)) # Truecontains() 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 clusterChaque 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)) # 2ClusterCollection 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.