Frage

Ich versuche, mithilfe von DBSCAN (Scikit-Learn-Implementierung) und Standortdaten einen Cluster zu erstellen.Meine Daten liegen im NP-Array-Format vor, aber um DBSCAN mit der Haversine-Formel verwenden zu können, muss ich eine Distanzmatrix erstellen.Ich erhalte die folgende Fehlermeldung, wenn ich dies versuche (ein Fehler, der vom Typ „Modul“ nicht aufrufbar ist). Nach dem, was ich online gelesen habe, handelt es sich um einen Importfehler, aber ich bin mir ziemlich sicher, dass das bei mir nicht der Fall ist.Ich habe meine eigene Haversinus-Distanzformel erstellt, bin mir aber sicher, dass der Fehler nicht darin liegt.

Das sind meine Eingabedaten, ein np-Array (ResultArray).

[[ 53.3252628   -6.2644198 ]
[ 53.3287395   -6.2646543 ]
[ 53.33321202  -6.24785807]
[ 53.3261015   -6.2598324 ]
[ 53.325291    -6.2644105 ]
[ 53.3281323   -6.2661467 ]
[ 53.3253074   -6.2644483 ]
[ 53.3388147   -6.2338417 ]
[ 53.3381102   -6.2343826 ]
[ 53.3253074   -6.2644483 ]
[ 53.3228188   -6.2625379 ]
[ 53.3253074   -6.2644483 ]]

Und das ist die Codezeile, die fehlerhaft ist.

distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResultArray,(lambda u,v: haversine(u,v))))

Dies ist die Fehlermeldung:

File "Location.py", line 48, in <module>
distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResArray,(lambda u,v: haversine(u,v))))
File "/usr/lib/python2.7/dist-packages/scipy/spatial/distance.py", line 1118, in pdist
dm[k] = dfun(X[i], X[j])
File "Location.py", line 48, in <lambda>
distance_matrix = sp.spatial.distance.squareform(sp.spatial.distance.pdist
(ResArray,(lambda u,v: haversine(u,v))))
TypeError: 'module' object is not callable

Ich importiere Scipy als SP.(scipy als sp importieren)

War es hilfreich?

Lösung

Bitte beachten Sie die Antwort von @TommasoF.Diese Antwort ist falsch: pdist ermöglicht die Auswahl einer benutzerdefinierten Abstandsfunktion.Ich werde die Antwort löschen, sobald sie nicht mehr als richtige Antwort ausgewählt wird.

Einfach scipy'S pdist erlaubt nicht die Übergabe einer benutzerdefinierten Distanzfunktion.Wie Sie im lesen können Dokumente, Sie haben einige Optionen, aber die Distanz zur Gegenseite ist nicht in der Liste der unterstützten Metriken enthalten.

(Matlab pdist unterstützt die Option jedoch, siehe Hier)

Sie müssen die Berechnung „manuell“ durchführen, d. h.Mit Schleifen funktioniert so etwas:

from numpy import array,zeros

def haversine(lon1, lat1, lon2, lat2):
    """  See the link below for a possible implementation """
    pass

#example input (your's, truncated)
ResultArray = array([[ 53.3252628, -6.2644198 ],
                     [ 53.3287395  , -6.2646543 ],
                     [ 53.33321202 , -6.24785807],
                     [ 53.3253074  , -6.2644483 ]])

N = ResultArray.shape[0]
distance_matrix = zeros((N, N))
for i in xrange(N):
    for j in xrange(N):
        lati, loni = ResultArray[i]
        latj, lonj = ResultArray[j]
        distance_matrix[i, j] = haversine(loni, lati, lonj, latj)
        distance_matrix[j, i] = distance_matrix[i, j]

print distance_matrix
[[ 0.          0.38666203  1.41010971  0.00530489]
 [ 0.38666203  0.          1.22043364  0.38163748]
 [ 1.41010971  1.22043364  0.          1.40848782]
 [ 0.00530489  0.38163748  1.40848782  0.        ]]

Nur als Referenz kann eine Implementierung in Python von Haverside gefunden werden Hier.

Andere Tipps

Mit dem Scipy können Sie eine benutzerdefinierte Entfernungsfunktion definieren, wie in der Dokumentation der Dokumentation an diesem Link und ist hier berichtet, um den Komfort zu erhalten:

generasacodicetagpre.
generasacodicetagpre.

Hier melde ich meine Version des Codes inspiriert, inspiriert auf dem Code von diesem Link :

generasacodicetagpre.

und anrufen auf folgende Weise:

generasacodicetagpre.

In meiner Implementierung hat die Matrix A als erste Säule die Längenwerte und als zweite Säule die in Dezimalgrad ausgedrückten Latitude-Werte.

Sie können jetzt räumliche Breiten- und Längengraddaten mit dem DBSCAN und der Haversinus-Metrik von scikit-learn gruppieren, ohne vorher eine Distanzmatrix mit scipy berechnen zu müssen.

db = DBSCAN(eps=2/6371., min_samples=5, algorithm='ball_tree', metric='haversine').fit(np.radians(coordinates))

Dies geht aus diesem Tutorial hervor Clustering räumlicher Daten mit scikit-learn DBSCAN.Beachten Sie insbesondere, dass die eps Der Wert ist 2 km geteilt durch 6371 (Erdradius in km), um ihn in Bogenmaß umzurechnen.Beachten Sie das auch .fit() Nimmt Koordinaten im Bogenmaß für die Haversinus-Metrik an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top