2016-04-12 18 views
5

Ich habe eine Sammlung von n Koordinatenpunkten der Form (x, y, z). Diese werden in einer n × 3-Matrix M gespeichert.Clustering und Distanzberechnung in Julia

Gibt es eine eingebaute Funktion in Julia, um den Abstand zwischen jedem Punkt und jedem anderen Punkt zu berechnen? Ich arbeite mit einer kleinen Anzahl von Punkten, daher ist die Rechenzeit nicht so wichtig.

Mein übergeordnetes Ziel ist es, einen Clustering-Algorithmus auszuführen. Wenn es also einen Clustering-Algorithmus gibt, den ich mir ansehen kann, muss ich nicht zuerst diese Abstände berechnen. Ein Beispiel für die Daten, für die ich Clustering durchführen möchte, finden Sie unten. Offensichtlich müsste ich das nur für die z-Koordinate tun.

Example of data set I need to perform clustering on

+0

verschiedene Clustering-Algorithmen Es gibt keine. Welche Art von Clusterbildung möchten Sie ausführen? – niczky12

+0

Ich habe einen Datensatz, der die (x, y, z) Koordinaten von zwei separaten hängenden Stromkabeln angibt. Sie unterscheiden sich nur entlang der z-Achse (Höhe). Daher würde ich gerne Cluster basierend auf z-Koordinaten erstellen. Eine Clusterbildung, die eine gerade Linie zum Schneiden der Cluster verwendet, funktioniert jedoch nicht, da der tiefste Punkt der oberen Kettenlinie niedriger als der höchste Punkt der unteren Kettenlinie sein kann. Ich spalte gerade die Kettenlinie in kleine Stücke auf, wo das Geradlinientyp Clustering funktioniert, aber das ist keine sehr saubere Lösung. – lara

Antwort

7

Entfernungen zu berechnen, verwenden Sie die Distancespackage.

Mit einer Matrix X können Sie paarweise Abstände zwischen den Spalten berechnen. Dies bedeutet, dass Sie Ihre Eingabepunkte (Ihre n Objekte) als Spalten der Matrizen angeben sollten. (In Ihrer Frage erwähnen Sie NX3 Matrix, so können Sie dies mit der transpose() Funktion umsetzen würde.)

Hier ist ein Beispiel dafür, wie es zu benutzen:

>using Distances # install with Pkg.add("Distances") 

>x = rand(3,2) 

3x2 Array{Float64,2}: 
0.27436 0.589142 
0.234363 0.728687 
0.265896 0.455243 

>pairwise(Euclidean(), x, x) 

2x2 Array{Float64,2}: 
0.0  0.615871 
0.615871 0.0  

Wie Sie die oben genannten Renditen sehen die Abstandsmatrix zwischen den Spalten X. Sie können bei Bedarf auch andere Entfernungsmetriken verwenden, überprüfen Sie einfach die Dokumente für das Paket.

+0

Danke. Wenn ich jetzt ein anderes Problem mit mehr Daten versuche, bekomme ich den Speicherfehler. Irgendeine Idee, wie eine Entfernungsmatrix auf einer riesigen Menge von Daten berechnet werden kann? – lara

5

Nur für die Vollständigkeit der @ niczky12 Antwort gibt es ein Paket in Julia namens Clustering, die im Wesentlichen, wie der Name sagt, ermöglicht Ihnen, Clustering durchzuführen.

Eine Probe kmeans Algorithmus:

>>> using Clustering   # Pkg.add("Clustering") if not installed 

>>> X = rand(3, 100)   # data, each column is a sample 
>>> k = 10     # number of clusters 

>>> r = kmeans(X, k) 
>>> fieldnames(r) 
8-element Array{Symbol,1}: 
:centers  
:assignments 
:costs  
:counts  
:cweights 
:totalcost 
:iterations 
:converged 

Das Ergebnis ist in der Rückkehr der KMeans gespeichert (r), die die obigen Felder enthält. Die zwei wahrscheinlich interessantesten Felder: r.centers enthält die vom kmeans-Algorithmus erkannten Zentren und r.assigments enthält den Cluster, zu dem jeder der 100 Abtastwerte gehört.

Es gibt mehrere andere Clustermethoden in demselben Paket. Fühlen Sie sich frei, in die Dokumentation einzutauchen und diejenige anzuwenden, die Ihren Bedürfnissen am besten entspricht.


In Ihrem Fall, wie Sie Ihre Daten ein N x 3 Matrix ist, müssen Sie es nur transponieren:

M = rand(100, 3) 
kmeans(M', k)