2012-09-15 14 views
5

Tengo un conjunto de entrenamiento muy grande (~ 2Gb) en un archivo CSV. El archivo es demasiado grande para leer directamente en la memoria (read.csv() detiene el equipo) y me gustaría reducir el tamaño del archivo de datos mediante PCA. El problema es que (hasta donde puedo decir) necesito leer el archivo en la memoria para ejecutar un algoritmo de PCA (por ejemplo, princomp()).haciendo PCA en un conjunto de datos muy grande en R

He probado el paquete bigmemory para leer el archivo en un big.matrix, pero princomp no funciona en big.matrix objetos y no parece que big.matrix puede ser convertido en algo así como un data.frame.

¿Hay alguna forma de ejecutar princomp en un archivo de datos grande que me falta?

Soy un principiante relativo en R, por lo que algo de esto puede ser obvio para usuarios más avezados (disculpas en avance).

Gracias por cualquier información.

+0

Básicamente lo que necesita hacer PCA sin estimar la matriz de covarianza de la muestra. Existe una gran cantidad de literatura sobre PCA de gran dimensión, particularmente con aplicaciones para procesamiento de imágenes y mercados financieros. Sin embargo, es más que probable que no sea algo trivial. – John

+2

¿Cuántas observaciones y cuántas variables contiene el archivo? – rolando2

+0

@ rolando2 Contiene aproximadamente 50K filas y ~ 10000 columnas – user141146

Respuesta

8

La forma en que lo resolví fue calculando la matriz de covarianza de muestra de forma iterativa. De esta forma, solo necesita un subconjunto de datos para cualquier punto en el tiempo. La lectura en solo un subconjunto de los datos se puede hacer usando readLines donde se abre una conexión al archivo y se lee iterativamente. El algoritmo se ve algo como (que es un algoritmo de dos pasos):

Calcular los valores medios por columna (suponiendo que son las variables)

  1. conexión de archivo abierto (con = open(...))
  2. Leer 1000 líneas (readLines(con, n = 1000))
  3. Calcular sumas de cuadrados por columna
  4. agregar esas sumas de cuadrados a una variable (sos_column = sos_column + new_sos)
  5. R epea 2-4 hasta el final del archivo.
  6. Divida por el número de filas menos 1 para obtener la media.

calcular la matriz de covarianza:

  1. conexión de archivo abierto (con = open(...))
  2. Leer 1.000 líneas (readLines(con, n = 1000))
  3. Calcular todos los productos cruzados utilizando crossprod
  4. salvar a los productos cruzados en una variable
  5. Repita 2-4 hasta el final del archivo.
  6. divida por el número de filas menos 1 para obtener la covarianza.

Cuando se tiene la matriz de covarianza, simplemente llame princomp con covmat = your_covmat y princomp se saltará calulating la matriz de covarianza sí mismo.

De esta manera, los conjuntos de datos que puede procesar son mucho, mucho más grandes que su RAM disponible. Durante las iteraciones, el uso de memoria es aproximadamente la memoria que toma el fragmento (p.1000 filas), después de eso el uso de la memoria se limita a la matriz de covarianza (nvar * nvar dobles).

+0

tal vez haya una forma de no almacenar toda la matriz de covarianzas en la memoria? – mrgloom

+0

Si tiene una pregunta nueva, cree una nueva, tal vez refiriéndose a esta pregunta. –

0

Aspectos a tener en cuenta al importar un gran conjunto de datos.

  1. Requisito de memoria.

  2. comprender la estructura de conjunto de datos que se importan utiliza el código de ejemplo siguiente:

    inicial < - read.table ("datatable.csv", nRows = 100);

    clases < - sapply (inicial, clase);

    tabAll < - read.table ("datatable.csv", colClasses = clases)

  3. Si conjunto de datos es el uso a gran fread (función) a partir de datos, clase mesa.

  4. Realice la técnica de reducción de dimensionalidad antes de aplicar PCA. Ejemplo, elimine variables altamente correlacionadas o variables nearZeroVariance ya que no contribuyen a la salida.

  5. Luego aplique PCA.

espero que ayude

Cuestiones relacionadas