在R中的非常大的数据集上执行PCA

use*_*146 6 r bigdata pca

我在CSV文件中有一个非常大的训练集(~2Gb).该文件太大,无法直接读入内存(read.csv()使计算机停止),我想使用PCA减小数据文件的大小.问题是(据我所知)我需要将文件读入内存以运行PCA算法(例如princomp()).

我已经尝试过将bigmemory包读取为一个文件big.matrix,但princomp不能在big.matrix对象上运行,它似乎big.matrix不能转换为类似的东西data.frame.

有没有办法princomp在我丢失的大型数据文件上运行?

我是R的相对新手,所以对于经验丰富的用户来说,其中一些可能是显而易见的(道歉).

谢谢你的任何信息.

Pau*_*tra 10

我解决它的方法是迭代计算样本协方差矩阵.通过这种方式,您只需要任何时间点的数据子集.只需readLines打开与文件的连接并迭代读取,就可以只读取数据的子集.该算法看起来像(这是一个两步算法):

计算每列的平均值(假设是变量)

  1. 打开文件连接(con = open(...))
  2. 读1000行(readLines(con, n = 1000))
  3. 计算每列的平方和
  4. 将这些平方和添加到变量(sos_column = sos_column + new_sos)
  5. 重复2-4直到文件结束.
  6. 除以行数减1得到平均值.

计算协方差矩阵:

  1. 打开文件连接(con = open(...))
  2. 读1000行(readLines(con, n = 1000))
  3. 使用计算所有交叉产品 crossprod
  4. 将这些交叉产品保存在变量中
  5. 重复2-4直到文件结束.
  6. 除以行数减1来得到协方差.

当你拥有的协方差矩阵,只需要调用princompcovmat = your_covmatprincomp将跳过calulating协方差矩阵自己.

通过这种方式,您可以处理的数据集远远大于可用的RAM.在迭代期间,内存使用大致是块所占用的内存(例如1000行),之后内存使用限于协方差矩阵(nvar*nvar加倍).