我在CSV文件中有一个非常大的训练集(~2Gb).该文件太大,无法直接读入内存(read.csv()使计算机停止),我想使用PCA减小数据文件的大小.问题是(据我所知)我需要将文件读入内存以运行PCA算法(例如princomp()).
我已经尝试过将bigmemory包读取为一个文件big.matrix,但princomp不能在big.matrix对象上运行,它似乎big.matrix不能转换为类似的东西data.frame.
有没有办法princomp在我丢失的大型数据文件上运行?
我是R的相对新手,所以对于经验丰富的用户来说,其中一些可能是显而易见的(道歉).
谢谢你的任何信息.
Pau*_*tra 10
我解决它的方法是迭代计算样本协方差矩阵.通过这种方式,您只需要任何时间点的数据子集.只需readLines打开与文件的连接并迭代读取,就可以只读取数据的子集.该算法看起来像(这是一个两步算法):
计算每列的平均值(假设是变量)
con = open(...))readLines(con, n = 1000))sos_column = sos_column + new_sos)计算协方差矩阵:
con = open(...))readLines(con, n = 1000))crossprod当你拥有的协方差矩阵,只需要调用princomp与covmat = your_covmat和princomp将跳过calulating协方差矩阵自己.
通过这种方式,您可以处理的数据集远远大于可用的RAM.在迭代期间,内存使用大致是块所占用的内存(例如1000行),之后内存使用限于协方差矩阵(nvar*nvar加倍).