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
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
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
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.
Anstatt über Datenpunkte zu iterieren, können Sie dies einfach zu einer Matrixoperation zusammenfassen, was bedeutet, dass Sie nur über K
iterieren müssen.
Läuft in:
%Vor%auf meinem Laptop.
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
:
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.
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.
Tags und Links r performance distance