DIST () Función en R: Tamaño de vector Limitación -- r campo con cluster-analysis camp Relacionados El problema

dist() function in R: vector size limitation


5
vote

problema

Español

Estaba tratando de dibujar un agrupamiento jerárquico de algunas muestras (40 de ellas) sobre algunas características (genes) y tengo una mesa grande con filas de 500k y 41 columnas (1er, se llama) y cuando lo intenté

  d<-dist(as.matrix(file),method="euclidean")   

obtuve este error

  Error: cannot allocate vector of size 1101.1 Gb   

¿Cómo puedo conseguir esta limitación? Lo busqué en Google y me encontré con el paquete FF en R, pero no entiendo muy bien si eso podría resolver mi problema.

¡Gracias!

Original en ingles

I was trying to draw a hierarchical clustering of some samples (40 of them) over some features(genes) and I have a big table with 500k rows and 41 columns (1st one is name) and when I tried

d<-dist(as.matrix(file),method="euclidean") 

I got this error

Error: cannot allocate vector of size 1101.1 Gb 

How can I get around of this limitation? I googled it and came across to the ff package in R but I don't quite understand whether that could solve my issue.

Thanks!

     
         
         

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Grupo jerárquico en general no es el mejor enfoque para tratar con conjuntos de datos muy grandes.

en su caso, sin embargo, hay un problema diferente. Si desea agrupar la estructura de las muestras de sus datos es incorrecta. Las observaciones deben representarse como las filas y la expresión génica (o cualquier tipo de datos que tenga) como las columnas.

Permite asumir que tiene datos como este:

  data <- as.data.frame(matrix(rnorm(n=500000*40), ncol=40))   

Lo que quieres hacer es:

   # Create transposed data matrix  data.matrix.t <- t(as.matrix(data))   # Create distance matrix  dists <- dist(data.matrix.t)   # Clustering  hcl <- hclust(dists)   # Plot  plot(hcl)   

nota

Debe recordar que las distancias euclidianas pueden ser bastante engañosas cuando trabaja con datos de alta dimensión.

 

Generally speaking hierarchical clustering is not the best approach for dealing with very large datasets.

In your case however there is a different problem. If you want to cluster samples structure of your data is wrong. Observations should be represented as the rows, and gene expression (or whatever kind of data you have) as the columns.

Lets assume you have data like this:

data <- as.data.frame(matrix(rnorm(n=500000*40), ncol=40)) 

What you want to do is:

 # Create transposed data matrix  data.matrix.t <- t(as.matrix(data))   # Create distance matrix  dists <- dist(data.matrix.t)   # Clustering  hcl <- hclust(dists)   # Plot  plot(hcl) 

NOTE

You should remember that euclidean distances can be rather misleading when you work with high-dimensional data.

 
 
   
   
3
 
vote

Cuando se trata de grandes conjuntos de datos, R no es la mejor opción.

La mayoría de los métodos en R parece implementarse calculando una matriz de distancia completa, lo que necesita inherentemente O(n^2) memoria y tiempo de ejecución. Las implementaciones basadas en matriz "sólidas> no se escalan bien a los datos grandes , a menos que la matriz es escasa (que una matriz de distancia por definición no es).

No sé si se dio cuenta de que 1101.1 Gb es 1 Terabyte. No creo que tenga tanta memoria RAM, y probablemente no tendrá tiempo para esperar para computar esta matriz.

Por ejemplo, elki es mucho más poderoso para agrupar, ya que puede habilitar las estructuras de índice para que Acelere muchos algoritmos. Esto guarda tanto la memoria (generalmente hasta el uso de la memoria lineal; para almacenar las asignaciones de clústeres) y el tiempo de ejecución (generalmente hacia abajo a LIKE0 , One 9988777661111111/13/14/13/14/14 >

Pero, por supuesto, también varía de algoritmo al algoritmo. K-significa, por ejemplo, que solo necesita distancias de punto a medias, no necesita (y no puede usar) un 99887776612 Matriz de distancia.

Así que al final: no creo que el límite de memoria de R sea su problema real . El método que desea utilizar no escala.

 

When dealing with large data sets, R is not the best choice.

The majority of methods in R seems to be implemented by computing a full distance matrix, which inherently needs O(n^2) memory and runtime. Matrix based implementations don't scale well to large data , unless the matrix is sparse (which a distance matrix per definition isn't).

I don't know if you realized that 1101.1 Gb is 1 Terabyte. I don't think you have that much RAM, and you probably won't have the time to wait for computing this matrix either.

For example ELKI is much more powerful for clustering, as you can enable index structures to accelerate many algorithms. This saves both memory (usually down to linear memory usage; for storing the cluster assignments) and runtime (usually down to O(n log n), one O(log n) operation per object).

But of course, it also varies from algorithm to algorithm. K-means for example, which needs point-to-mean distances only, does not need (and cannot use) an O(n^2) distance matrix.

So in the end: I don't think the memory limit of R is your actual problem. The method you want to use doesn't scale.

 
 
2
 
vote

Solo experimento un problema relacionado, pero con menos filas (alrededor de 100 mil por columnas).
El tamaño de la RAM es el factor limitante.
Para limitar la necesidad en el espacio de memoria, utilicé 2 funciones diferentes de 2 paquetes diferentes. de paraleldista El pararista de la función () le permite obtener las distancias bastante rápido. Utiliza RAM, por supuesto, durante el proceso, pero parece que el objeto DIST resultante está tomando menos memoria (sin idea de por qué).
Luego usé la función HClust (), pero desde el paquete FastCluster . FastCluster en realidad no es tan rápido en tal cantidad de datos, pero parece que utiliza menos memoria que la HRSUT predeterminada ().
Espero que esto sea útil para cualquiera que encuentre este tema.

 

I just experience a related issue but with less rows (around 100 thousands for 16 columns).
RAM size is the limiting factor.
To limitate the need in memory space I used 2 different functions from 2 different packages. from parallelDist the function parDist() allow you to obtain the distances quite fast. it uses RAM of course during the process but it seems that the resulting dist object is taking less memory (no idea why).
Then I used the hclust() function but from the package fastcluster. fastcluster is actually not so fast on such an amount of data but it seems that it uses less memory than the default hclust().
Hope this will be useful for anybody who find this topic.

 
 

Relacionados problema

0  ¿Cómo determinar un clúster no es significativo en la agrupación en línea?  ( How to determine a cluster is not significant in online clustering ) 
Estoy agrupando un flujo de datos en tiempo real, más precisamente en Twitter Stream. Como puntos de datos (Tweets) llegan desde la corriente, se asigna un pu...

0  Errores de agrupamiento inesperados (partición alrededor de los médicos)  ( Unexpected clustering errors partitioning around mediods ) 
Estoy usando el paquete fpc para determinar el número óptimo de clusters. La función pamk() toma una matriz de disimilitud como argumento y no requiere qu...

0  Dividir un conjunto de puntos en subconjuntos basados ​​en segmentos de línea  ( Splitting a set of points into subsets based on line segments ) 
Tengo un conjunto de puntos y un conjunto de segmentos de línea. Me gustaría dividir el conjunto de puntos en subconjuntos o clusters según estos segmentos de...

0  Cómo imprimir el nombre de color en lugar de valores hexagonales usando Python  ( How to print the color name instead of hex values using python ) 
Estoy usando este código de GitHub que identifica los colores en una imagen, pero me muestra valores hexagonales en lugar de nombres de colores ... Esto es ...

2  Mal k-significa con descenso de degradado usando TensorFlow  ( Bad k means with gradient descent using tensorflow ) 
Actualmente aprendiendo TensorFlow Estoy trabajando para implementar Rimeans en clústering usando TensorFlow. Estoy siguiendo un tutorial en TensorFlow, que ...

2  Cadena similar a un conjunto de cuerdas  ( String similar to a set of strings ) 
Necesito comparar un conjunto de cuerdas a otro conjunto de cadenas y encontrar qué cadenas son similares (coincidencia de cadenas difusa). Por ejemplo: { ...

0  Agrupamiento de datos  ( Clustering of data ) 
Tengo un conjunto de datos de 2 dimensiones con varios puntos (por ejemplo, 100), cada uno con una coordenada X e Y en Matlab. Necesito acumular estos puntos ...

0  Google Maps Timeline - ¿Cómo funciona el algoritmo de segmentación?  ( Google maps timeline how does the segmentation algorithm work ) 
Google Timeline muestra una segmentación muy agradable de mi historial de ubicación. Identifica claramente los períodos de tiempo (es decir, los segmentos) ...

10  Generando 'vecinos' para los usuarios basados ​​en la calificación  ( Generating neighbours for users based on rating ) 
Estoy buscando técnicas para generar 'vecinos' (personas con gusto similar) para usuarios en un sitio en el que estoy trabajando; Algo similar a la forma en q...

0  Dendrograma de corte al más alto nivel de pureza  ( Cutting dendrogram at highest level of purity ) 
Estoy tratando de crear un programa que los documentos de clústeres usan un agrupamiento aglomerativo jerárquico, y la salida del programa depende de cortar e...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos