Antes que nada, soy nuevo en R (comencé ayer).Cálculo de todas las distancias entre un punto y un grupo de puntos de manera eficiente en R
I tienen dos grupos de puntos, data
y centers
, la primera de tamaño n
y el segundo de tamaño K
(por ejemplo, n = 3823
y K = 10
), y para cada i
en el primer conjunto, necesito encontrar j
en el segundo con la distancia mínima.
Mi idea es simple: para cada i
, vamos dist[j]
sea la distancia entre i
y j
, sólo necesito utilizar which.min(dist)
a encontrar lo que estoy buscando.
Cada punto es una matriz de 64
dobles, por lo
> dim(data)
[1] 3823 64
> dim(centers)
[1] 10 64
He tratado con
for (i in 1:n) {
for (j in 1:K) {
d[j] <- sqrt(sum((centers[j,] - data[i,])^2))
}
S[i] <- which.min(d)
}
que es extremadamente lenta (con n = 200
, se tarda más de 40 años !!). La solución más rápida que escribí es
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)
}
incluso si lo hace un montón de computación que no uso (porque dist(m)
calcula la distancia entre todas las filas de m
), que es la forma más rápida que el otro (¿Alguien puede explicar por qué?), pero no es lo suficientemente rápido para lo que necesito, porque no se usará solo una vez. Y también, el código distance
es muy feo. Traté de reemplazarlo con
distance <- function(point, group) {
return (dist(rbind(point,group))[1:nrow(group)])
}
pero esto parece ser dos veces más lento. También traté de usar dist
para cada par, pero también es más lento.
No sé qué hacer ahora. Parece que estoy haciendo algo muy malo. ¿Alguna idea sobre cómo hacer esto de manera más eficiente?
ps: Necesito esto para implementar k-means a mano (y tengo que hacerlo, es parte de una tarea). Creo que solo necesitaré la distancia euclidiana, pero todavía no estoy seguro, por lo que preferiré tener algún código donde el cálculo de la distancia pueda reemplazarse fácilmente. stats::kmeans
hacen todos los cálculos en menos de un segundo.
personas' aquí especie-a-no-como-hacer tareas ... así que trate de concentrarse en un problema específico. – aL3xa