Pregunta:
MDS en un gran conjunto de datos (R o Python)
Percy
2017-03-02 11:05:29 UTC
view on stackexchange narkive permalink

Tengo un conjunto de datos grande de 400000 $ \ veces $ 400000 (matriz de disimilitud) y quiero hacer un escalado multidimensional en él.Sin embargo, después de mirar la función cmdscale () genérica en R, solo toma una matriz máxima de 46340 $ \ veces $ 46340 como entrada.¿Hay alguna forma de solucionar esto?Además, ¿Python tiene el mismo tipo de limitación (en el paquete sklearn)?

P.D.Debo agregar que la memoria no es un problema aquí.

Diría que esta es una matriz bastante grande.Incluso la simple descomposición propia será problemática.MDS es más que eso.¿Ha considerado primero hacer un análisis de conglomerados para reducir la cardinalidad de los datos?
Podría valer la pena observar las variaciones estocásticas de los algoritmos de reducción de dimensionalidad para un conjunto de datos tan grande.[tSNE] (https://lvdmaaten.github.io/tsne/) podría ser útil.
¿Realmente _necesitas_ procesar todos esos datos?Sin más detalles, creo que esta es una pregunta más inmediata que debe responder usted mismo antes de continuar.
Es posible que este hilo le resulte útil: https://stats.stackexchange.com/questions/68678/out-of-sample-embedding-into-principal-coordinate-space.Enumera algunas implementaciones extensibles de MDS, lo que haría que su problema se pudiera tratar mediante aproximación: inicie un espacio MDS con una muestra aleatoria de su conjunto de datos y proyecte el resto.
Tres respuestas:
user20160
2017-03-02 15:32:48 UTC
view on stackexchange narkive permalink

Se necesitaría más de un terabyte solo para almacenar una matriz de distancia densa de ese tamaño, utilizando números de coma flotante de doble precisión. Probablemente no sea factible atacar de frente un problema de tan gran escala utilizando un algoritmo MDS estándar. El tiempo de ejecución se escala como $ O (n ^ 3) $, y es posible que ni siquiera pueda ajustar la matriz de distancia en la memoria en una sola máquina. Dependiendo de su situación, es posible que pueda solucionarlo. Cómo hacer esto depende de sus datos y problemas específicos, pero aquí hay algunos ejemplos:

1) PCA es equivalente a MDS clásico usando la métrica de distancia euclidiana. Entonces, si este es el tipo de MDS que desea realizar, puede usar PCA en su lugar. Un requisito adicional es que tenga acceso a los puntos de datos originales como vectores, en lugar de solo la matriz de distancias. Existen muchos algoritmos para ejecutar PCA de manera eficiente en enormes conjuntos de datos.

2) Utilice una forma aproximada de MDS. Este enfoque podría funcionar si desea realizar MDS clásico. No requiere una métrica de distancia euclidiana o una representación del espacio vectorial de los datos (el acceso a las distancias es todo lo que se requiere). Landmark MDS es un buen ejemplo. El primer paso es elegir un conjunto más pequeño de 'puntos de referencia' que representen el conjunto de datos completo. Estos se pueden obtener simplemente muestreando aleatoriamente los datos, o usando un algoritmo rápido y codicioso para optimizarlos un poco más. La agrupación en clústeres también podría usarse en principio, pero es computacionalmente costosa y no necesaria. La MDS clásica se realiza en los puntos de referencia para incrustarlos en un espacio vectorial. Los resultados clásicos de MDS para los puntos de referencia se utilizan luego para mapear el conjunto de datos completo en el espacio de incrustación. Aunque no se formuló originalmente como tal, resulta que Landmark MDS funciona utilizando la aproximación de Nyström, que es una forma de aproximar los valores propios / vectores propios de una matriz grande utilizando una submatriz más pequeña.

3) Si desea realizar una MDS no clásica, métodos como Landmark MDS no funcionarán. Esto se debe a que las variantes no clásicas de MDS se resuelven de forma iterativa mediante algoritmos de optimización, en lugar de resolver un problema de valor propio. En su lugar, podría funcionar adoptar el siguiente enfoque: a) Seleccione una submuestra representativa de los datos. b) Use el tipo de MDS que elija para incrustar estos puntos en un espacio vectorial. c) Usando los puntos de datos submuestreados como ejemplos, aprenda un mapeo en el espacio de incrustación usando un método de regresión no lineal. Se necesitaría el cuidado adecuado para aprender un buen mapeo, no sobreajustarlo, etc. d) Utilice el mapeo aprendido para obtener una incrustación para todo el conjunto de datos. Recuerdo haber visto un par de artículos que describen este tipo de enfoque como una forma de realizar generalizaciones fuera de muestra para algoritmos de reducción de dimensionalidad no lineal en general. Pero me parece que también podría usarse como una forma de aproximar de manera eficiente MDS no clásica. Es posible que existan soluciones más especializadas; si es así, me encantaría saber de ellos.

4) La paralelización podría usarse para resolver el problema completo si es absolutamente necesario. Por ejemplo, para MDS clásico, podría distribuir bloques de la matriz de distancia entre máquinas, luego usar operaciones matriciales paralelas / distribuidas y eigensolver para realizar MDS. Probablemente se podría imaginar algún esquema para MDS no clásicos. Pero, esto podría ser una empresa considerable, y es muy posible que un MDS aproximado funcione lo suficientemente bien. Entonces, ese es un mejor lugar para comenzar.

Referencias:

De Silva y Tenenbaum (2004). Escala multidimensional escasa utilizando puntos de referencia.

Platt (2005). FastMap, MetricMap y Landmark MDS son todos algoritmos de Nystrom.

@Percy Este [hilo] (https://stats.stackexchange.com/questions/68678/out-of-sample-embedding-into-principal-coordinate-space) hace referencia a varias implementaciones históricas de MDS en R y Python
pulasthi
2017-12-08 23:02:46 UTC
view on stackexchange narkive permalink

Si desea realizar MDS en conjuntos de datos tan grandes, deberá utilizar una implementación paralela de MDS.Puede encontrar una implementación paralela de MDS basada en MPI en [1].Pero para ejecutar un conjunto de datos de 400000 × × 400000, necesitaría un clúster grande o una supercomputadora.He usado esto con un conjunto de datos con una matriz de datos de 200000 x 200000 (usé una supercomputadora de 24 nodos para ejecutarlo, se podría hacer con menos pero tomará más tiempo).También hay una versión que funciona con Spark y que puedes usar [2].Pero la implementación de Spark es mucho más lenta que la implementación basada en MPI

[1] https://github.com/DSC-SPIDAL/damds

[2] https://github.com/DSC-SPIDAL/damds.spark

Gregory
2020-08-06 18:38:32 UTC
view on stackexchange narkive permalink

Estaba experimentando graves problemas de rendimiento con cmdscale () . Después de investigar un poco, logré encontrar una biblioteca java llamada mdsj ( https://www.inf.uni-konstanz.de/exalgo/software/mdsj/) que puede recibir una matriz en formato de archivo de texto y generar una versión escalada multidimensional en un archivo de texto. Todo esto se puede hacer en bash, que se puede llamar usando la función system () de R. Compartiré mi código aquí en caso de que alguien lo encuentre útil:

  saveMDS = function (daisy.mat) {
   write.table (daisy.mat, file = paste ("./ MDS / data.txt", sep = ""), row.names = FALSE, col.names = FALSE)
   system ('bash -c "cd MDS; > data-MDS.txt; java -jar mdsj.jar data.txt data-MDS.txt"')
}


loadMDS = function () {

return (as.matrix (read.table ("./ MDS / data-MDS.txt", header = FALSE, sep = "")))


}

datos <- data.frame (x = runif (10000), y = runif (10000), z = runif (10000))
daisy.mat <- as.matrix (daisy (data [, c (1: 3)], metric = "gower"))
saveMDS (daisy.mat)
mds.data = loadMDS ()
 

En este momento, tengo una carpeta llamada MDS en mi directorio de trabajo donde se almacenan los archivos de texto de datos.

¡Espero que esto te ayude!



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...