Berechnung aller Abstände zwischen einem Punkt und einer Gruppe von Punkten effizient in R

8

Zunächst einmal bin ich neu bei R (ich begann gestern).

Ich habe zwei Gruppen von Punkten, data und centers , die erste mit der Größe n und die zweite mit der Größe K (zB n = 3823 und K = 10 ) und für jede i in der ersten Menge, ich muss j in der zweiten mit der Mindestdistanz finden.

Meine Idee ist einfach: pro i , dist[j] ist der Abstand zwischen i und j , ich brauche nur which.min(dist) , um zu finden, wonach ich suche.

Jeder Punkt ist ein Array von 64 doubles, also

%Vor%

Ich habe es mit

probiert %Vor%

was extrem langsam ist (mit n = 200 , es dauert mehr als 40s !!). Die schnellste Lösung, die ich geschrieben habe, ist

%Vor%

Auch wenn es eine Menge Berechnungen gibt, die ich nicht verwende (weil dist(m) den Abstand zwischen allen Zeilen von m berechnet), ist es viel schneller als das andere (kann jemand erklären warum?) , aber es ist nicht schnell genug für das, was ich brauche, weil es nicht nur einmal benutzt wird. Und auch der Code distance ist sehr hässlich. Ich habe versucht, es durch

zu ersetzen %Vor%

aber das scheint zweimal langsamer zu sein. Ich habe auch versucht, dist für jedes Paar zu verwenden, aber es ist auch langsamer.

Ich weiß nicht, was ich jetzt tun soll. Es scheint, als würde ich etwas sehr falsch machen. Irgendeine Idee, wie man das effizienter macht?

ps: Ich brauche das, um k-means von Hand zu implementieren (und ich muss es tun, es ist Teil einer Aufgabe). Ich glaube, ich brauche nur Euklidische Distanz, aber ich bin mir noch nicht sicher, also werde ich lieber einen Code haben, wo die Entfernungsberechnung leicht ersetzt werden kann. stats::kmeans führt alle Berechnungen in weniger als einer Sekunde aus.

    
dbarbosa 12.06.2010, 18:12
quelle

5 Antworten

13

Anstatt über Datenpunkte zu iterieren, können Sie dies einfach zu einer Matrixoperation zusammenfassen, was bedeutet, dass Sie nur über K iterieren müssen.

%Vor%

Läuft in:

%Vor%

auf meinem Laptop.

    
Jonathan Chang 12.06.2010, 21:35
quelle
3

rdist () ist eine R-Funktion aus dem Paket {fields}, die in der Lage ist, Entfernungen zwischen zwei Punktmengen im Matrixformat schnell zu berechnen.

Ссылка

Verwendung:

%Vor%     
Deuterium 20.10.2016 09:30
quelle
1

Sie können sich die apply Funktionen ansehen.

Zum Beispiel, dieser Code

%Vor%

Kann leicht durch etwas wie

ersetzt werden %Vor%

Sie können es definitiv optimieren, aber Sie bekommen den Punkt, den ich hoffe

    
nico 12.06.2010 18:52
quelle
1

dist arbeitet schnell, weil es vektorisiert ist und interne C-Funktionen aufruft.
Sie Code-in-Schleife könnte auf viele Arten vektorisiert werden.

Um beispielsweise den Abstand zwischen data und centers zu berechnen, können Sie outer :

verwenden %Vor%

Dies gibt Ihnen n x K Matrix von Entfernungen. Und sollte viel schneller als Loop sein.

Dann könnten Sie max.col verwenden, um das Maximum in jeder Zeile zu finden (siehe Hilfe, es gibt einige Nuancen, wenn es viele Maxima gibt). X muss negiert sein, weil wir nach Minimum suchen.

%Vor%

Um effizient in R zu sein, sollten Sie möglichst vektorisiert werden. Loops könnten in vielen Fällen durch vektorisierten Ersatz ersetzt werden. Überprüfen Sie die Hilfe für rowSums (die auch rowMeans , colSums , rowSums ), pmax , cumsum beschreibt. Sie könnten SO suchen, z.B.   Ссылка (Kopieren Sie diesen Link, ich kann nicht klickbar machen) einige Beispiele.

    
Marek 12.06.2010 21:22
quelle
0

Meine Lösung:

%Vor%

Sie können es versuchen, wie:

%Vor%     
Adriano Rivolli 23.09.2016 17:16
quelle

Tags und Links