Manera eficiente de calcular distancias entre centroides desde la matriz de distancia

8

Tengamos una matriz simétrica cuadrada de distancias euclidianas cuadradas entre puntos y un vector alargado indica la pertenencia a un grupo o grupo ( grupos) de los puntos; un clúster puede consistir en punto.renortenortek1

¿Cuál es la forma más eficiente o realmente eficiente (en términos de velocidad) para calcular las distancias entre los centroides del grupo aquí?

Hasta ahora siempre hice el análisis de la Coordinadora Principal en esta situación. PCoA, o MDS de Torgerson equivale a convertir primero en la matriz de productos escalares ("doble centrado") y luego realizar PCA de él. De esta manera creamos coordenadas para los puntos en el espacio euclidiano que abarcan. Después de eso, es fácil calcular las distancias entre los centroides de la manera habitual, como lo haría con los datos. PCoA tiene que hacer descomposición propia o SVD de la semidefinida simétrica positiva , peroDSngrouped points x variablesn x nSnpuede ser bastante grande Además, la tarea no es una reducción de dimensionalidad y en realidad no necesitamos esos ejes principales ortogonales. Así que tengo la sensación de que estas descomposiciones pueden ser una exageración.

Entonces, ¿tiene conocimiento o ideas sobre una forma potencialmente más rápida?

ttnphns
fuente

Respuestas:

6

Deje que los puntos sean indexados x1,x2,,xntodos ellos en Rd. DejarI ser los índices para un clúster y Jlos índices para otro grupo. Los centroides son

cI=1|I|iIxi, cJ=1|J|jJxj

y se desea encontrar su distancia al cuadrado ||cIcJ||2 en términos de las distancias al cuadrado Dij=||xixj||2.

Exactamente como desglosaríamos sumas de cuadrados en los cálculos de ANOVA, una identidad algebraica es

||cIcJ||2=1|I||J|(SS(IJ)(|I|+|J|)(1|I|SS(I)+1|J|SS(J)))

dónde "SS"se refiere a la suma de cuadrados de distancias entre cada punto en un conjunto y su centroide. La identidad de polarización re-expresa esto en términos de distancias al cuadrado entre todos los puntos:

SS(K)=12yo,jKEl |El |Xyo-XjEl |El |2=yo<jKreyoj.

El esfuerzo computacional por lo tanto es O((El |yoEl |+El |JEl |)2), con una constante implícita muy pequeña. Cuando los grupos son aproximadamente del mismo tamaño y hayk de ellos, esto es O(norte2/ /k2), que es directamente proporcional al número de entradas en re: eso sería lo mejor que uno podría esperar.


R código para ilustrar y probar estos cálculos a continuación.

ss <- function(x) {
  n <- dim(x)[2]
  i <- rep(1:n, n)
  j <- as.vector(t(matrix(i,n)))
  d <- matrix(c(1,1) %*% (x[,i] - x[,j])^2 , n) # The distance matrix entries for `x`
  sum(d[lower.tri(d)])
}
centroid <- function(x) rowMeans(x)
distance2 <- function(x,y) sum((x-y)^2)
#
# Generate two clusters randomly.
#
n.x <- 3; n.y <- 2
x <- matrix(rnorm(2*n.x), 2)
y <- matrix(rnorm(2*n.y), 2)
#
# Compare two formulae.
#
cat("Squared distance between centroids =",
    distance2(centroid(x), centroid(y)),
    "Equivalent value =", 
    (ss(cbind(x,y)) - (n.x + n.y) * (ss(x)/n.x + ss(y)/n.y)) / (n.x*n.y),
    "\n")
whuber
fuente
¡Perfecto! Debo confesar que a pesar de que conocía las identidades de paralelogramo, no podía ver claramente el vínculo con mi tarea y deducir la fórmula. Muchas gracias a ti. Ya he programado la función (en SPSS) en función de su fórmula para cualquier número de centroides y, de hecho, es más rápida con una matriz D grande que la vía indirecta a través de PCoA.
ttnphns
También agregaría que la fórmula sigue siendo válida si los grupos / grupos se cruzan por las composiciones de los objetos.
ttnphns
Sí, eso es correcto: la identidad que uso no asume que los grupos son disjuntos.
whuber
Simplemente agregue un enlace tardío: su método en notación matricial, en el que basé esa función que dije anteriormente. stats.stackexchange.com/a/237811/3277
ttnphns
1
@ameba K se refiere a cualquier subconjunto de {1,2,...,norte}.
whuber