Schnellste paarweisen Distanz-Metrik in python

Ich habe ein 1D array von zahlen, und Sie möchten berechnen Sie alle paarweisen euklidischen Distanzen. Ich habe eine Methode (Dank SO), dies zu tun, mit Ausstrahlung, aber es ist ineffizient, weil es berechnet jede Strecke zweimal. Und es nicht gut zu skalieren.

Hier ist ein Beispiel, die gibt mir was ich will, mit ein array von 1000 zahlen.

import numpy as np
import random
r = np.array([random.randrange(1, 1000) for _ in range(0, 1000)])
dists = np.abs(r - r[:, None])

Was ist die Schnellste Implementierung in scipy/numpy/scikit-learn, die ich verwenden können, um dies zu tun, da es skaliert werden muss, um Situationen, in denen die 1D-array hat >10k Werte.

Hinweis: die matrix ist symmetrisch, so dass ich vermute, dass es möglich ist, zumindest ein 2x speedup durch die Auseinandersetzung, die, ich weiß nur nicht, wie.

  • Es gibt eine Funktion dafür: scipy.spatial.distance.pdist. Ich weiß nicht, ob dies ist die Schnellste option, da es braucht, um Prüfungen für mehrdimensionale Daten, nicht-euklidischen Normen, und andere Dinge, aber es ist gebaut.
  • Wie schnell brauchen Sie dazu? Es ist nie zu skalieren besser als O(n^2), da Sie zum Auffüllen n^2 Einträge ausgegeben. Ihre bestehende Lösung ist O(n^2), und es scheint nicht zu viel Raum für wichtige Optimierungen.
  • Dies scheint scale zu >10k Werte gut genug schon, wenn ich es versuche. Denken Sie daran, dass Sie brauchen, um füllen Sie 100 Millionen Einträge ausgegeben. Das ist fast ein halbes gigabyte der paarweisen Distanzen.
  • Abgeordnete für @user2357112 und @askewchan, aber stellen Sie sicher, dass Ihre numpy kompiliert wird mit BLAS-oder MKL, die Sie herunterladen, direkt von sourceforge ist wahrscheinlich nicht.
  • Ich glaube nicht... Wenn Sie Folgen Sie den source-code, in der end dieser wird die Funktion immer aufgerufen. Es gibt nicht nur keine Lust auf Optimierung, aber für 1D-Vektoren es ist die Quadratur und die Quadratwurzel zur Berechnung des absoluten Wertes. Wahrscheinlich schlimmer als die OP-code für seinen speziellen Anwendungsfall.
  • Wenn ich mich nicht Irre, scipy immer kompiliert mit BLAS, es ist nicht optional, wie bei numpy.
  • Ah, ich stehe korrigiert. Vielen Dank für die eigentlich auf der Suche it up 🙂
  • Auf der anderen Seite, aufrufen pdist mit 'cityblock' für die Metrik sollte den trick tun.
  • Haben Sie diesen thread? stackoverflow.com/questions/17527340/... Dort hatte ich ein ähnliches problem, wenn die arrays groß, Sie haben, um den Missbrauch Speicher-layout zu bekommen Beschleunigungen
  • scipy.spatial.distance nur Anrufe BLAS für eine begrenzte Anzahl von Fällen, und nur nach einigen Operationen, weil BLAS hat keine Distanz-Funktionen. Es ist nicht schneller, für die OP ' s Anwendungsfall.
  • Du hast Recht @larsmans, als Jaime hat das auch gesagt. Ich habe gelöscht, den Kommentar.
  • stört es Sie geben einen link, die Frage, auf die Sie sich beziehen? Was die post SO?
  • sorry - das war so lange her, dass ich mich nicht erinnern, was original-post-it war. Aber ich weiß, es war irgendwo auf SO!

InformationsquelleAutor roblanf | 2013-11-29
Schreibe einen Kommentar