Zunächst einmal bin ich neu in R (ich begann gestern).Berechnung aller Entfernungen zwischen einem Punkt und einer Gruppe von Punkten effizient in R
I haben zwei Gruppen von Punkten, data
und centers
, wobei die erste Größe n
und die zweite Größe K
(zum Beispiel n = 3823
und K = 10
) und für jeden i
in dem ersten Satz, ich brauche j
zu finden in der Sekunde mit dem Mindestabstand.
Meine Idee ist einfach: für jeden i
, lassen dist[j]
der Abstand zwischen i
und j
, ich brauche nur which.min(dist)
zu verwenden, um zu finden, was ich suche.
Jeder Punkt ist ein Array von 64
verdoppelt, so
> dim(data)
[1] 3823 64
> dim(centers)
[1] 10 64
ich mit
for (i in 1:n) {
for (j in 1:K) {
d[j] <- sqrt(sum((centers[j,] - data[i,])^2))
}
S[i] <- which.min(d)
}
versucht haben, die extrem langsam (mit n = 200
, es mehr als 40s dauert !!). Die schnellste Lösung, die ich geschrieben habe, ist
distance <- function(point, group) {
return(dist(t(array(c(point, t(group)), dim=c(ncol(group), 1+nrow(group)))))[1:nrow(group)])
}
for (i in 1:n) {
d <- distance(data[i,], centers)
which.min(d)
}
Auch wenn es eine Menge Rechen tut, die ich nicht verwenden (da dist(m)
den Abstand zwischen allen Zeilen von m
berechnet), es ist viel schneller als die andere (Kann jemand erklären warum?), aber es ist nicht schnell genug für das, was ich brauche, weil es nicht nur einmal verwendet wird. Und auch der distance
Code ist sehr hässlich. Ich habe versucht, es durch
zu ersetzen, 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 dies, 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
alle Berechnungen in weniger als einer Sekunde durchführen.
Volks Runde hier Art-a-nicht-wie-zu tun Aufgaben ... so versuchen, auf ein bestimmtes Problem zu konzentrieren. – aL3xa