在非常大的数据R SET做PCA(doing PCA on very large data set

2019-08-01 01:47发布

我有一个CSV文件非常大的训练集(〜2GB)。 该文件是太大而不能直接读入内存( read.csv()所带来的计算机停顿),我想,以减少使用PCA数据文件的大小。 问题是,(据我可以告诉)我需要阅读的文件到内存中,以便运行PCA算法(例如, princomp()

我曾尝试bigmemory包读取的文件big.matrix ,但princomp不上正常工作big.matrix对象,它似乎并不像big.matrix可以转换成类似一个data.frame

是否有运行的方式princomp对我缺少一个大的数据文件吗?

我在R2上的相对新手,所以一些,这可能是显而易见的经验更丰富的用户(在AVANCE道歉)。

感谢您的任何信息。

Answer 1:

我解决的办法是通过迭代计算样本协方差矩阵。 这样,你只需要数据在任何时间点的一个子集。 在短短的一个数据子集阅读可以做到用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加倍)。



Answer 2:

事情导入大型数据集时,记在心上。

  1. 内存要求。

  2. 了解数据集的结构被导入使用以下示例代码:

    初始< - 函数read.table( “datatable.csv”,NROWS = 100);

    类< - sapply(初始,类);

    tabAll < - 函数read.table( “datatable.csv”,colClasses =班)

  3. 如果数据集是从数据中大量使用的fread()函数,表类。

  4. 采用PCA之前执行降维技术。 例如,如他们不向输出除去高度相关变量或nearZeroVariance变量。

  5. 然后应用PCA。

我希望它能帮助



文章来源: doing PCA on very large data set in R
标签: r bigdata pca