Frage:
Clustering einer Matrix (Homogenitätsmessung)
Xodarap
2010-09-30 18:58:09 UTC
view on stackexchange narkive permalink

Ich habe eine 2-Dim-Matrix und möchte z. Alle höheren Werte befinden sich in der oberen linken Ecke. Ich kann es nicht einfach in R ^ 3 projizieren und einen Standard-Clustering-Algorithmus verwenden, da ich den Wert nicht als eine Dimension für sich betrachten möchte.

Gibt es einen Algorithmus, den ich dafür verwenden kann?

BEARBEITEN:

Um es neu zu formulieren, nehmen wir an, es war wie

 | Hohe Werte ... niedrige Werte || ... | Niedrige Werte ... ... || ... | Hohe Werte .. niedrige Werte | 

Ich möchte wissen, dass es oben links und unten links einen "Cluster" hoher Werte gibt.

BEARBEITEN 2:

Die Matrix repräsentiert ein Bild. Die Werte jeder Zelle repräsentieren die Konzentration einer Substanz an dieser Koordinate. Ich möchte wissen, wie homogen das Bild ist (d. H. Wie gut die Substanz "zusammengemischt" ist). Außerdem möchte ich wissen, woher die Inhomogenität (falls vorhanden) kommt.

Die obere linke Ecke der 2x2-Matrix ist nur ein Element ... Können Sie die Frage neu formulieren?
@mbq: Ich habe versucht, neu zu formulieren. Lassen Sie mich wissen, wenn es noch unklar ist (hohe und niedrige Werte beziehen sich auf Blockmatrizen in der großen Matrix).
Viel besser jetzt, danke. Je mehr Details Sie hier eingeben (Sind diese Cluster scharf oder glatt? Ist alles verrauscht? Wie groß sollten diese Cluster sein?), Desto nützlicher ist die Antwort.
Die GIS-Leute haben diese "Hotspot-Analyse" genannt.Wenn Sie bei einer Suche "Raster" oder "Bild" hinzufügen, finden Sie verschiedene Techniken.Suchen Sie weiter nach "lokaler Variabilität".Ein weiteres relevantes Thema ist "Scan-Statistik": Kostenlose Software ist unter https://www.satscan.org/ verfügbar.Ihre Bibliographie weist auf eine [große Liste möglicher Lösungen] hin (https://www.satscan.org/references.html#Statistical%20Methodology).
Vier antworten:
#1
+6
whuber
2010-09-30 21:10:52 UTC
view on stackexchange narkive permalink

Bei dieser Frage geht es um räumliche Korrelation. Es gibt viele Methoden, um dies zu charakterisieren und zu quantifizieren. Allen gemeinsam ist der Vergleich der Werte an einem Ort mit denen an nahe gelegenen Orten. Normalerweise ist die Referenzverteilung eine Art räumlicher stochastischer Prozess, bei dem Daten unabhängig von Punkt zu Punkt erzeugt werden ("vollständige räumliche Zufälligkeit"). Einige Methoden charakterisieren nur das durchschnittliche Verhalten, während andere detailliertere Erkundungsinstrumente zur Identifizierung von Clustern von Extremwerten bereitstellen.

Für drei verschiedene Ansätze lesen Sie (1) die Literatur zu Geostatistik / Kriging / Variographie; (2) andere Maße der räumlichen Korrelation wie Ripleys K- und L-Funktionen oder die Getis-Ord $ G_i $ -Statistik; und (3) geografisch gewichtete Regression. Zugängliche, nicht technische und korrekte Erklärungen zu all diesen Themen finden Sie auf ESRI.com. Die Wikipedia-Artikel sind spärlich und leider von unterschiedlicher Qualität.

Die ersten beiden Ansätze werden mit R-Paketen wie spatstat und geoRglm gut unterstützt. Es gibt auch freie Software für (2), von denen einige der bekanntesten Geoda und CrimeStat sind. Ich kenne keine kostenlose Implementierung von GWR (# 3), aber es gibt gute Ressourcen, die von seinen Erfindern gepflegt werden.

Ich wusste auch von keiner Freeware-GWR-Implementierung, bis ich kürzlich auf diese Website stieß, http://www.ecoevol.ufg.br/sam/#Graphics. Es würde mich nicht wundern, wenn andere existieren würden.
@Andy Danke! Das ist ein echter Fund. Diese Software scheint die Funktionen von GeoDa mit logistischer Regression und GWR zu reproduzieren. Ich freue mich darauf, es zu erkunden.
#2
+5
M. Tibbits
2010-10-05 22:06:36 UTC
view on stackexchange narkive permalink

Sie können auch Morans I in Betracht ziehen, das im R-Paket "ape" verfügbar ist. Verwenden Sie dann einfach eine Gewichtung basierend auf der Entfernung:

  nRows <- 30nCols <- 15nPixel <- nRows * nCols # Erstellen Sie ein zufälliges Bildbild <-Matrix (sample.int (256, nPixel, ersetzen) = TRUE), nrow = nRows, ncol = nCols) - 1L # 1D zu 2D Index FunctionreverseIndex <- Funktion (vectorIdx, nRows, nCols) {# Wenn Sie aus irgendeinem Grund Zeilenmajor verwenden, müssen Sie # drehe diese um. J <- Boden ((vectorIdx - 1L) / nCols) I <- (vectorIdx - 1L) - nCols * J # Rückgabe: c (I + 1L, J + 1L)} # DistanzfunktiondistFunc <- Funktion (I, J) {idx1 <-reverseIndex (I, nRows, nCols) idx2 <-reverseIndex (J, nRows, nCols) idDiff <-idx1 - idx2 # Rückgabe: sqrt (idDiff% *% idDiff)} # Distance Matrixmatrix erstellen rep (seq_len (nPixel), nPixel), rep (seq_len (nPixel), jeweils = nPixel)), nrow = nPixel, ncol = nPixel) # Entfernung invertieren für Morans IinvDist <-1 / distdiag (invDist) <- Morans I: ape :: Moran.I (as.vector (Bild), dist)  

Beachten Sie, dass dies lediglich einen &-Assoziationstest darstellt und nicht identifiziert wo diese Zuordnung in Ihrer Matrix ist.

Das sieht sehr nützlich aus! Um ganz klar zu sein (da ich R nicht fließend spreche): Dies berechnet die räumliche Korrelation, gewichtet jedoch die Korrelationen zwischen Dingen, die näher beieinander liegen, stärker. Ist das korrekt?
Genau. Es verwendet den umgekehrten Abstand zwischen den Pixeln (gemessen in Pixel), um das Maß der räumlichen Autokorrelation zu gewichten. Beachten Sie, dass ich ein Graustufenbild generiert habe, aber Sie können dies auch auf ein Farbbild anwenden, indem Sie entweder die Farben separat behandeln oder eine kombinierte Partitur erstellen.
#3
+4
denis
2010-10-11 20:46:44 UTC
view on stackexchange narkive permalink

Gute Frage. Ein trivialer Weg, um "Cluster hoher Werte oben links" (im Gegensatz zu Korrelationen) zu finden, besteht darin, das Bild in Kacheln aufzuteilen und die Kachelmittel zu betrachten. Zum Beispiel bedeutet

  100 x 100 Kacheln: [[82 78 80 94 99 100] [80 53 66 62 80 100] [82 61 65 64 72 98] [87 83 99 81 80 100] [100 100 100 100 100 100]] bedeutet 50 x 50 Kacheln: [[100 85 84 100 70 96 100 100 100 100] [83 59 57 71 67 88 89 86 98 100 100] [87 58 54 49 71 74 71 61 61 100 100] [100 76 58 52 59 61 55 59 65 95 100] [100 62 59 60 57 63 60 60 59 97 100] [100 68 65 59 59 82 76 61 61 70 95] [83 64 76 66 96 100 96 61 80 67 100] [100 100 97 92 100 100 84 82 83 88 100] [100 100 100 100 100 100 100 100 100 100 100]]  

( Ein Plot mit durchschnittlicher Höhe / Farbe in jeder Kachel wäre 10x besser.)

(Wenn Sie nach Merkmalen in Bildern suchen, was ist ein "Merkmal"? ZB ein rotes Stoppschild, wie in Histogramme zur Feature-Darstellung)

#4
+2
flywtink
2010-09-30 19:35:50 UTC
view on stackexchange narkive permalink

Das Ziel ist nur, ein Maß zu finden, das uns sagt, wie gemischt alle Pixel sind. Bei 2 Datenmatrizen mit genau der gleichen Werteverteilung, wenn die Werte des ersten in räumlichen Gruppen geordnet oder zusammengefasst sind und die Werte des zweiten gut verteilt sind (hohe Punkte und nicht in der Nähe anderer Höhepunkte, niedrige Punkte nicht in der Nähe anderer Tiefs), wie wird diese Dispersion / Klumpigkeit bewertet? Die Matrizen haben genau die gleiche Varianz oder Standardabweichung, so dass dies keine gute Methode ist. Eine Idee ist die Verwendung der 2D-Fourier-Transformation, da ein klumpigeres Bild intuitiv ist eine niedrigere Frequenz, aber ich bin mir nicht sicher, ob dies tatsächlich eine übliche oder nützliche Praxis für diese Art der Bewertung ist.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 2.0-Lizenz, unter der er vertrieben wird.
Loading...