Gruppieren von geografischen Daten basierend auf der Punktposition und den zugehörigen Punktwerten


15

Gegebene Datenpunkte mit Längengrad, Breitengrad und einem dritten Eigenschaftswert dieses Punktes. Wie kann ich Punkte basierend auf dem Eigenschaftswert in Gruppen (geografische Unterregionen) gruppieren? Ich suchte bei Google und fand heraus, dass dieses Problem als "räumlich begrenztes Clustering" oder "Regionalisierung" bezeichnet wird. Ich bin jedoch nicht mit dem Umgang mit geografischen Daten vertraut und habe keine Ahnung, welche Art von Algorithmen gut sind und welche Python / R-Pakete für diese Aufgabe gut sind.

Angenommen, meine Datenstreudiagramme lauten wie folgt, um eine intuitivere Vorstellung davon zu geben, was ich möchte: Bildbeschreibung hier eingeben

Jeder Punkt ist also ein Punkt, x ist der Längengrad, y ist der Breitengrad und colormap zeigt an, ob der Wert groß oder klein ist. Ich möchte diese Punkte basierend auf der Position und Ähnlichkeit der Werte in Unterregionen / Gruppen / Cluster unterteilen. Wie die folgenden (es ist nicht genau das, was ich will, nur um eine intuitive Idee zu zeigen.): Bildbeschreibung hier eingeben

Wie kann ich das erreichen?


Ihre Frage ist im Moment etwas weit gefasst. Haben Sie eines der R- oder Python-Pakete ausprobiert?
John Powell

@ JohnBarça Derzeit halte ich das clusterPy-Paket für nützlich und rise-group.org/risem/clusterpy/clusterpy0_9_9/… zeigt, wie es verwendet wird. Meine Daten bestehen jedoch aus drei Spaltenpunkten: Breite, Länge und Wert. Ich möchte Punkte basierend auf dem Punktwert in Unterregionsgruppen unterteilen. Das Paket-Eingabeformat scheint wie ein Polygon oder ein Gitter zu sein, und ich habe nicht herausgefunden, wie ich es direkt verwenden kann, um räumliche Punkte zu behandeln.
Excalibur


@ Iris Danke! Ich habe die Webseite überprüft, aber es scheint, als ob ich immer noch keinen Weg finden kann, solche räumlichen Punkte mit drei Spalten direkt mit der Eigenschaft zu behandeln.
Excalibur

@Excalibur für geografische Cluster würde ich derzeit HDBScan empfehlen. In Bezug auf Ihren dritten Wert könnte dies als eine Art Gewicht angesehen werden, denke ich. Ohne alle Werte in den gleichen Raum zu projizieren, könnte dies eine schwierige Aufgabe sein. Können Sie Hintergrundinformationen zu Ihrem Ziel angeben?
Timothy Dalton

Antworten:


4

Das Rioja-Paket bietet Funktionen für eingeschränktes hierarchisches Clustering. Für das, was Sie als "räumlich beschränkt" betrachten, würden Sie Ihre Schnitte basierend auf der Entfernung spezifizieren, während Sie für "Regionalisierung" k nächstgelegene Nachbarn verwenden könnten. Es wird dringend empfohlen, Ihre Daten so zu projizieren, dass sie sich in einem entfernungsbasierten Koordinatensystem befinden.

require(sp)
require(rioja)

data(meuse)
  coordinates(meuse) <- ~x+y
  cdat <- data.frame(x=coordinates(meuse)[,1],y=coordinates(meuse)[,2])
  rownames(cdat) <- rownames(meuse@data)

# Constrained hierarchical clustering 
chc <- chclust(dist(cdat), method="conslink")

# Using kNN with 3 neighbors
chc.n3 <- cutree(chc, k=3) 

# Using distance 
chc.d200 <- cutree(chc, h=200) 

meuse@data <- data.frame(meuse@data, KNN=as.factor(chc.n3), DClust=chc.d200)

opar <- par
  par(mfcol=c(1,2))  
   cols <- topo.colors(length(unique(meuse@data$KNN)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$KNN))) {
        v <- unique(meuse@data$KNN)[i] 
          color[(meuse@data$KNN == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="kNN Clustering")
      box()

    cols <- topo.colors(length(unique(meuse@data$DClust)))  
    color <- rep("xx", nrow(meuse@data))
      for(i in 1:length(unique(meuse@data$DClust))) {
        v <- unique(meuse@data$DClust)[i] 
          color[(meuse@data$DClust == v)] <- cols[i]
        }
    plot(meuse, col=color, pch=19, main="Distance Clustering")
      box() 
par <- opar

1
Hi @JeffreyEvans, danke für deine Antwort! Sie schlagen also vor, dass ich den dritten Eigenschaftswert in eine andere Art von Koordinate projiziere, oder? Ich denke jedoch, dass es einige existierende Algorithmen geben sollte, die (lon, lat) mit assoziierten Attributen unterscheiden und dann Clustering durchführen und Punkte zu kontinuierlichen Regionen machen, und Punkte in denselben Regionen sollten ähnliche Werte haben (natürlich gibt es einige Ausreißer). . Gibt es ein Paket, das dies erreichen kann? Ich habe mein Problem für ein intuitiveres Beispiel aktualisiert. Vielen Dank.
Excalibur
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.