我有一个CSV文件非常大的训练集(〜2GB)。 该文件是太大而不能直接读入内存( read.csv()
所带来的计算机停顿),我想,以减少使用PCA数据文件的大小。 问题是,(据我可以告诉)我需要阅读的文件到内存中,以便运行PCA算法(例如, princomp()
我曾尝试bigmemory
包读取的文件big.matrix
,但princomp
不上正常工作big.matrix
对象,它似乎并不像big.matrix
可以转换成类似一个data.frame
。
是否有运行的方式princomp
对我缺少一个大的数据文件吗?
我在R2上的相对新手,所以一些,这可能是显而易见的经验更丰富的用户(在AVANCE道歉)。
感谢您的任何信息。
我解决的办法是通过迭代计算样本协方差矩阵。 这样,你只需要数据在任何时间点的一个子集。 在短短的一个数据子集阅读可以做到用readLines
,你打开该文件的连接,并反复阅读。 该算法看起来像(这是一个两步的算法):
计算每列中的平均值(假设是变量)
- 打开文件连接(
con = open(...)
- 读1000线(
readLines(con, n = 1000)
- 计算每列的平方和
- 平方那些总和添加到一个变量(
sos_column = sos_column + new_sos
) - 重复2-4,直到文件结束。
- 除以1的行数减去获得的平均值。
计算协方差矩阵:
- 打开文件连接(
con = open(...)
- 读1000线(
readLines(con, n = 1000)
- 计算使用所有跨产品
crossprod
- 保存这些交叉积在一个变量
- 重复2-4,直到文件结束。
- 通过行减1数除以得到的协方差。
当你拥有的协方差矩阵,只需要调用princomp
与covmat = your_covmat
和princomp
将跳过calulating协方差矩阵自己。
通过这种方式,你可以处理的数据集是多少,比你的可用RAM大得多。 在迭代中,存储器使用是大致块取存储器(例如1000行),在此之后的存储器使用量被限制为协方差矩阵(NVAR * NVAR加倍)。