Suite

Comment regrouper des points en clusters d'un diamètre maximum dans PostGIS ?

Comment regrouper des points en clusters d'un diamètre maximum dans PostGIS ?


Je travaille avec des arrêts de transit dans GTFS. Je souhaite regrouper des arrêts (N~8000 pour une agence de taille moyenne aux USA) qui sont proches les uns des autres afin de réduire le nombre de dimensions mais aussi regrouper des arrêts qui sont à une distance raisonnable les uns des autres : ex. transferts. K-means nécessite une spécification a priori du nombre de clusters, alors que j'aimerais que le diamètre du cluster soit spécifié par l'utilisateur. Un algorithme de clustering hiérarchique ascendant qui s'arrête à un diamètre spécifié est ce dont j'ai besoin.


Auparavant, j'avais écrit un algorithme de clustering hiérarchique qui fonctionnait sur de petits groupes de points, mais il n'évoluait pas bien jusqu'à un nuage de 8000 points. Après quelques bricolages, j'ai obtenu une version remaniée pour fonctionner. Il fait 8000 points en moins de 30 secondes sur un serveur, évoluant à quelque chose d'approximatif de N*log(N).

Les deux premières définitions de tables sont requises :

CREATE TABLE pt ( caractère stop_id variant (32) NON NULL, géométrie geom(Point) )

Et la définition du résultat de la fonction :

CREATE TABLE clustered_pt ( caractère stop_id variant (32) NON NULL, geom geometry (Point), cluster_id smallint )

Je n'ai pas testé avec plus de 32000 points, mais modifie le type decluster_iden conséquence si vous envisagez d'utiliser des ensembles de données plus volumineux.

CRÉER OU REMPLACER UNE FONCTION bottomup_cluster_index(points pt[], rayon entier) RETOURNE SETOF clustered_pt AS $BODY$ DECLARE srid int; compteur entier : =1 ; COMMENCER --Éviter tout le traitement s'il n'y a qu'un seul point. SI array_length(points,1)<2 ALORS RETURN QUERY SELECT stop_id::varchar(32), geom::geometry(point), 1 FROM unnest(points); REVENIR; FIN SI; CREATE TEMPORARY TABLE IF NOT EXISTS s'arrête (LIKE pt) ON COMMIT DROP; CREATE TEMPORARY SEQUENCE clusterids ; CREATE TEMPORARY TABLE clusters( stop_group geometry, stop_ids varchar[], cluster_id smallint DEFAULT nextval('clusterids') ) ON COMMIT DROP; ALTER SEQUENCE clusterids OWNED BY clusters.cluster_id; TRUNCATE s'arrête ; --insérer des points dans INSERT INTO stops(stop_id, geom) (SELECT (unnest(points)).* ); --Stocker le srid pour reconvertir les points après, suppose que tous les points ont le même SRID srid := ST_SRID(geom) FROM s'arrête LIMIT 1; --Transformer les points en un système de coordonnées UTM afin que les distances soient calculées en mètres. UPDATE arrête SET geom = ST_TRANSFORM(geom,26986) ; INSERT INTO clusters(stop_group, stop_ids) (SELECT ST_COLLECT(geom), ARRAY_AGG(stop_id) FROM stop GROUP BY geom --Regroupe les points qui se trouvent au même endroit); CREATE INDEX geom_index ON clusters USING gist (stop_group); Analyser les clusters ; BOUCLE --Si la distance maximale la plus courte entre deux clusters est supérieure à 2x le rayon spécifié, arrête l'algorithme de clustering. SI (SELECT ST_MaxDistance(a.stop_group,b.stop_group) FROM clusters a, clusters b WHERE ST_DFullyWithin(a.stop_group,b.stop_group, 2 * radius) AND a.cluster_id < b.cluster_id AND a.cluster_id > 0 AND b .cluster_id > 0 ORDER BY ST_MaxDistance(a.stop_group,b.stop_group) LIMIT 1) EST NULl ALORS SORTIE ; FIN SI; --Réindexer périodiquement la table des clusters ANALYSER les clusters ; compteur := compteur +1; AVEC find_nearest_clusters AS( SELECT DISTINCT ON (a.cluster_id) a.cluster_id, ST_collect(a.stop_group,b.stop_group) AS stop_group, ARRAY[a.cluster_id,b.cluster_id] as join_clusters, a.stop_ids||b.stop_ids AS stop_ids FROM clusters a, clusters b WHERE ST_DFullyWithin(a.stop_group,b.stop_group, 2 * radius) AND a.cluster_id < b.cluster_id AND a.cluster_id > 0 AND b.cluster_id > 0 ORDER BY a.cluster_id, ST_MaxDistance (a.stop_group,b.stop_group) ) --Si un cluster est lié à plusieurs clusters les plus proches, sélectionnez uniquement l'appariement sur la distance la plus courte et signalez les autres. , unique_clusters AS( SELECT a.*, CASE WHEN ST_AREA(ST_MinimumBoundingCircle(a.stop_group))>= ST_AREA(ST_MinimumBoundingCircle(b.stop_group)) THEN 1 ELSE 0 END as repeat_flag FROM find_nearest_clusters a LEFT_NEarest JOIN find <> b.cluster_id AND a.joined_clusters && b.joined_clusters ) --Mettre à jour l'ensemble des clusters avec les nouveaux clusters UPDATE clusters o SET --Définir à 0 le cluster_id du cluster qui contiendra 0 données. cluster_id = CASE WHEN o.cluster_id = join_clusters[2] THEN 0 ELSE join_clusters[1] END ,stop_group = CASE WHEN o.cluster_id = join_clusters[2] THEN NULL ELSE f.stop_group END ,stop_ids = CASE WHEN o.cluster_id = join_clusters [2] ALORS NULL ELSE f.stop_ids END FROM (SELECT DISTINCT ON (cluster_id) cluster_id, stop_group, join_clusters, stop_ids, repeat_flag FROM unique_clusters ORDER BY cluster_id, repeat_flag DESC ) f WHERE o.cluster_id = ANY (joint_clusters) AND repeat_flag =0 ; IF (SELECT COUNT(DISTINCT cluster_id) FROM clusters) < 2 ALORS EXIT ; FIN SI; FIN DE BOUCLE ; RELEVER NOTICE À L'AIDE DU MESSAGE = $$Nombre de passes $$||compteur ; RETURN QUERY SELECT stop_id::varchar(32), ST_TRANSFORM(geom, srid)::geometry(point), cluster_id FROM arrête la jointure interne (select cluster_id, unnest(stop_ids) AS stop_id FROM clusters)c USING (stop_id); FINIR; $BODY$ LANGUE plpgsql VOLATILE ;

Usage:

SELECT (clusters).* FROM ( SELECT bottomup_cluster_index(array_agg((stop_id,geom)::pt), 250) en tant que clusters FROM points )a

Une optimisation supplémentaire est la bienvenue !


Une façon consiste à utiliser des K-moyennes hiérarchiques, mais vous continuez à diviser chaque cluster qui est plus grand que K, jusqu'à ce qu'ils soient tous plus petits.

Une autre (approche opposée dans un certain sens) consisterait à utiliser le clustering agglomératif hiérarchique, c'est-à-dire une approche ascendante et encore une fois, assurez-vous de ne pas fusionner le cluster s'il en forme un nouveau de taille > K.

La plupart des algorithmes de clustering peuvent être utilisés pour créer un arbre dans lequel le niveau le plus bas n'est qu'un seul élément - soit parce qu'ils fonctionnent naturellement "de bas en haut" en joignant des paires d'éléments puis des groupes d'éléments joints, soit parce que - comme K-Means, ils peuvent être utilisés pour diviser à plusieurs reprises des groupes en plus petits groupes.

Une fois que vous avez un arbre, vous pouvez décider où séparer les sous-arbres pour former vos grappes de taille <= 100. Élaguer un arbre existant est souvent assez facile. Supposons que vous souhaitiez diviser une arborescence existante pour minimiser la somme de certains coûts des clusters que vous créez. Vous pourriez avoir:

Le problème avec le clustering naïf est que vous devez en effet calculer une matrice de distance qui contient la distance de A par rapport à tous les autres membres de l'ensemble. Cela dépend si vous avez prétraité la population ou si vous avez fusionné les grappes en individus typiques, puis recalculé à nouveau la matrice de distance.


5 réponses 5

J'ai pu combiner la réponse de Joran avec le commentaire de Dan H. Voici un exemple de sortie :

Le code python émet des fonctions pour R : map() et rect(). Cet exemple de carte des États-Unis a été créé avec :

puis vous pouvez appliquer les rect() en conséquence à partir de avec dans l'interpréteur R GUI (voir ci-dessous).

Voici un exemple de fichier TSV (site.tsv)

Avec mon ensemble de données, la sortie de mon script python, affichée sur la carte des États-Unis. J'ai changé les couleurs pour plus de clarté.

Ajout le 2013-05-01 pour Yacob

Ces 2 lignes vous donnent l'objectif global.

Si vous souhaitez affiner une partie d'une carte, vous pouvez utiliser ylim et xlim

Vous voudrez utiliser la carte du «monde».

Cela fait longtemps que je n'ai pas utilisé ce code python que j'ai posté ci-dessous donc je ferai de mon mieux pour vous aider.

Voici un exemple complet. Le fichier TSV se trouve sur pastebin.com. J'ai également inclus une image générée à partir de R qui contient la sortie de toutes les commandes rect().

Je le fais régulièrement en créant d'abord une matrice de distance, puis en exécutant un clustering dessus. Voici mon code.

Je ne sais pas si cela résout complètement votre problème. Vous voudrez peut-être tester avec différents k, et peut-être aussi faire une deuxième série de clusters de certains des premiers clusters au cas où ils seraient trop gros, comme si vous avez un point au Minnesota et un millier en Californie. Lorsque vous avez le groupe points.to.group$, vous pouvez obtenir les cadres de délimitation en trouvant la lat lon max et min par groupe.

Si vous voulez que X soit 20, et que vous avez 18 points à New York et 22 à Dallas, vous devez décider si vous voulez une petite et une très grande boîte (20 points chacun), s'il est préférable d'avoir la boîte Dallas inclure 22 points, ou si vous souhaitez diviser les 22 points à Dallas en deux groupes. Le regroupement basé sur la distance peut être utile dans certains de ces cas. Mais cela dépend bien sûr de la raison pour laquelle vous souhaitez regrouper les points.


1 réponse 1

Pour le moment, j'ai préparé une solution de contournement :

Pour obtenir les rayons des clusters, vous pouvez utiliser l'extrait de code suivant :

  • Suppose implicitement que tous les clusters ont le même rayon
  • Sépare les données en cellules Voronoi (qui peuvent également être vues à partir d'ici).
  • Les points de cluster (cercles) peuvent se chevaucher (c'est ainsi qu'ils sont définis).

Si vous souhaitez assouplir la forme des clusters (pas strictement sphériques ou cercles comme les K-moyennes), vous devez effectuer des modèles de mélange gaussiens.


Regrouper des points sur la base d'une matrice de distance

Bien que j'ai posé cette question sur stackoverflow pour éventuellement atteindre un public plus large, je me demande vos contributions sur ce problème. Sans donner beaucoup de recherche à ce sujet, j'ai pensé au problème du p-center ( $x_=1$ si le point est groupé autour du point $j$ 0, sinon) peut être utile pour construire un modèle simple pour partitionner les points en clusters de taille égale. Avec une contrainte appropriée, je pourrais aussi laisser $x_inmathbb_$ , je suppose. J'ai juste peur que la taille du problème soit trop grande pour la solution exacte, j'ai donc essayé de trouver le remède dans le monde des solutions heuristiques/algorithmiques. Comment aborderiez-vous ce problème ?

J'essaie de regrouper un ensemble de données avec 3 663 points. J'ai des coordonnées (x,y) et des poids point à point disponibles. Puisque je voudrais utiliser les poids au lieu des distances euclidiennes, j'ai implémenté le AgglomerativeClustering avec le sklearn de Python grâce à la réponse de Vivek Kumar ici. J'ai créé 20 clusters et j'ai eu le nombre de points suivant dans chaque cluster :

Comme on le voit, certains clusters n'ont que 1 ou 2 point(s). J'aimerais plutôt avoir un nombre de points dans les clusters presque uniformément répartis. Existe-t-il un moyen de contourner cela dans AgglomarativeClustering ou existe-t-il une autre méthode (de préférence dans le monde sklearn) qui répond au critère ? Je pense qu'une solution alternative pourrait consister à résoudre un problème de type p-centre, mais les performances temporelles des solveurs linéaires standard peuvent être un goulot d'étranglement car j'aimerais également une solution rapide.

À des fins de vérification de code, voici mon code, où TT_np_matrix est ma matrice de poids dans le type de matrice numpy, par exemple, TT_np_matrix = array([[2,3,4],[5,2,3],[4,5, 8]]) :

Vous trouverez ci-dessous ma formulation (bien que je dise "my", elle existe très probablement quelque part facilement) pour résoudre le problème de la programmation binaire/linéaire.

commencer min&quad somme_c_X_& exte&quad somme_ y_ =k & &quad somme_X_geq lfloor |I|/k floor y_j &forall jin I &quad sum_X_=1 &forall iin I &quad x_leq y_j &forall i,jin I &quad x,yin<0,1>, end

où $x_=1$ si le point $iin I$ est centré autour du point $jin I$ $ , sinon, et $y_j=1$ si le point $jin I$ est choisi comme centre $ , sinon. Ici, $k$ définit le nombre de clusters, et $I$ désigne l'ensemble de points à regrouper/partitionner.

Bien que j'écrive ceci, je ne veux pas l'implémenter car je pense qu'il sera plus coûteux en termes de calcul (indépendamment de l'exactitude) qu'un soi-disant algorithme de clustering d'apprentissage automatique. Je cherche plutôt une fonction implémentable open-source ou son exemple codé en Python (trop de contrainte, désolé).


Abstrait

Le clustering spatial est une méthode d'exploration de données largement utilisée pour la découverte du modèle d'agrégation spatiale. Cependant, les méthodes existantes négligent souvent la dépendance à l'échelle, empêchant la pleine reconnaissance des modèles de points et la détection des structures spatiales hiérarchiques. Le regroupement spatial dépend de l'échelle et est lié à la taille de l'unité d'analyse ainsi qu'à la hiérarchie de la cognition visuelle. Par conséquent, cet article propose un nouvel algorithme de clustering multi-scale grid (MSGC), qui fusionne des facteurs d'échelle double, c'est-à-dire une échelle analytique et une échelle visuelle qui intègre séquentiellement le clustering multi-analytical-scale (MASC) et le clustering multi-visuel-scale ( MVSC). MASC génère des grilles multi-granularité pour transformer les échelles analytiques, et MVSC extrait des clusters multi-niveaux pour exprimer la hiérarchie de la cognition visuelle. Des expériences comparatives ont validé l'algorithme proposé par rapport aux algorithmes classiques de regroupement spatial d'applications avec bruit (DBSCAN) et WaveCluster sur des ensembles de données géographiques synthétiques et réels. Les résultats démontrent que MSGC peut générer des clusters à plusieurs échelles pour une meilleure compréhension des modèles d'agrégation spatiale et des structures hiérarchiques des entités géographiques. De plus, il peut éliminer le bruit de manière adaptative et identifier efficacement les clusters de formes arbitraires. En raison de la nature du clustering de grille, la faible complexité de calcul permet une analyse visuelle en temps quasi réel et une exploration efficace des motifs de points sur de grands ensembles de données spatiales.


Le modèle stratégique des pôles d'innovation : mise en œuvre de la stratégie Océan bleu dans une région grecque typique ☆

Les pôles d'innovation sont des « groupements d'entreprises indépendantes (start-ups innovantes, petites, moyennes et grandes entreprises, ainsi que des organismes de recherche), opérant dans un secteur et une région particuliers et conçus pour stimuler l'activité innovante en favorisant des interactions intensives, le partage d'installations et l'échange de connaissances et d'expertise et en contribuant efficacement au transfert de technologie, à la mise en réseau et à la diffusion d'informations entre les entreprises du cluster ». En plus : axés sur la connaissance, spécialisés dans des activités innovantes à haute valeur ajoutée et fortement orientés vers les marchés internationaux. Afin de développer un développement durable et des entreprises entrepreneuriales réussies grâce au cluster, nous pouvons mettre en œuvre un modèle stratégique innovant tel que l'approche Blue Ocean Strategy. Blue Ocean Strategy suggère qu'une organisation devrait créer une nouvelle demande dans un espace de marché incontesté, ou un « Blue Ocean », plutôt que de rivaliser avec d'autres fournisseurs dans une industrie existante. La pierre angulaire de la stratégie Blue Ocean est la « Value Innovation ». Un océan bleu est créé lorsqu'une entreprise réalise une innovation de valeur qui crée de la valeur simultanément pour l'acheteur et l'entreprise. L'innovation (dans le produit, le service ou la livraison) doit augmenter et créer de la valeur pour le marché, tout en réduisant ou en éliminant simultanément les fonctionnalités ou les services qui sont moins valorisés par le marché actuel ou futur. Dans cet article spécifique, nous allons examiner comment nous devrions appliquer le concept de « océan bleu » dans une région grecque typique, pour imposer le développement de clusters, mettre en œuvre un nouveau modèle commercial et identifier des orientations fiables pour le développement de la politique d'innovation.


Utilisation de WLST (hors ligne) pour la configuration du cluster Coherence

L'outil de script WebLogic (WLST) est une interface de ligne de commande que vous pouvez utiliser pour automatiser les tâches de configuration de domaine, notamment la configuration et la gestion des clusters Coherence. Pour plus d'informations sur WLST, consultez Présentation de l'outil de script WebLogic .

Les exemples suivants illustrent l'utilisation de WLST en mode hors connexion pour créer et configurer un cluster Coherence. On suppose qu'un domaine a déjà été créé et que les exemples sont complétés dans l'ordre dans lequel ils sont présentés. De plus, les exemples ne créent qu'un niveau de données. Des niveaux supplémentaires peuvent être créés selon les besoins. Enfin, les exemples ne sont pas destinés à démontrer chaque Coherence MBean. Pour obtenir la liste complète des MBeans Coherence, consultez MBean Reference for Oracle WebLogic Server .


Une nouvelle approche pour le regroupement et la visualisation de données à l'aide de cartes auto-organisées

Une carte auto-organisée (SOM) est un modèle de réseau de neurones non linéaire et non supervisé qui pourrait être utilisé pour des applications de regroupement et de visualisation de données. L'une des principales lacunes de l'algorithme SOM est la difficulté pour les utilisateurs non experts d'interpréter les informations impliquées dans un SOM formé. Dans cet article, ce problème est abordé en introduisant une version améliorée de la méthode de visualisation proposée qui consiste en trois étapes principales : (1) le calcul de la distance inter-neurone à liaison unique, (2) le calcul du nombre de points de données dans chaque neurone, et (3) trouver la limite du cluster. Les résultats expérimentaux montrent que l'approche proposée a la forte capacité de démontrer efficacement la distribution des données, les distances inter-neurones et les limites des clusters. Les résultats expérimentaux indiquent que les effets de visualisation de l'algorithme proposé sont meilleurs que ceux d'autres méthodes de visualisation. De plus, notre schéma de visualisation proposé permet non seulement de comprendre intuitivement les résultats du regroupement, mais également d'avoir de bons effets de visualisation sur des ensembles de données non étiquetés.

Points forts

► Dans cet article, une nouvelle approche pour le regroupement et la visualisation de données à l'aide de cartes auto-organisées est proposée. ► Le schéma de visualisation proposé se compose de trois étapes principales : (1) le calcul de la distance inter-neurone à liaison unique, (2) le calcul de la distribution des données dans chaque neurone et (3) la recherche de la limite du cluster. ► Les résultats expérimentaux montrent que les effets de visualisation de l'algorithme proposé sont meilleurs que ceux des autres méthodes de visualisation.


Approche spatiale floue de clustering pour caractériser le risque d'inondation dans les systèmes de drainage des eaux pluviales urbaines

L'augmentation des contraintes environnementales des systèmes de drainage conduit à de fréquentes inondations urbaines, qui génèrent des impacts économiques, sociaux et environnementaux négatifs importants. Dans cette étude, une approche de clustering spatial flou (SFCA) est développée pour estimer les risques d'inondation possibles dans les systèmes de drainage des eaux pluviales et aborder la complexité et les incertitudes de l'évaluation des risques d'inondation. L'approche proposée est capable de mieux comprendre le comportement du système en explorant les modèles spatiaux du risque d'inondation. L'algorithme correspondant est utilisé pour diviser un système de drainage en divers groupes afin de refléter les niveaux de risque d'inondation le long de l'espace du réseau. L'application à un exemple de système de drainage démontre qu'il fournit une technique appropriée pour déterminer la distribution spatiale des risques d'inondation. Les résultats révèlent que les zones à risque élevé, modéré et faible identifiées par SFCA correspondent à un certain degré de stress environnemental. Les résultats de cette étude peuvent servir de base préliminaire pour guider les gestionnaires dans leur évaluation des risques d'inondation dans divers scénarios de gestion du drainage.

Ceci est un aperçu du contenu de l'abonnement, accessible via votre institution.


Voir la vidéo: POSTGIS INSTALLATION ON WINDOWS 10 u0026 CUSTOMIZE PGADMIN4 TO DARK MODE!