2012-09-15 64 views
5

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

我曾尝试bigmemory包读取文件中的big.matrix,但princomp不会对big.matrix对象功能,它似乎并不像big.matrix可以转换成有点像data.frame

在我错过的大型数据文件上有没有对princomp运行的方法?

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

感谢任何信息。

+0

基本上你需要做的PCA没有估计样本协方差矩阵。有关高维PCA的大量文献,特别是在图像处理和金融市场的应用方面。但是,这很可能不是一件微不足道的事情。 – John

+2

该文件包含多少个观测值和多少个变量? – rolando2

+0

@ rolando2它包含大约50K行和大约10000列 – user141146

回答

8

我解决的方式是通过迭代地计算所述样本协方差矩阵。通过这种方式,您只需要任何时间点的数据子集。可以使用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双倍)。

+0

也许有一种方法不将所有的协方差矩阵存储在内存中? – mrgloom

+0

如果你有一个新的问题,请创建一个新的问题,也许是指这个问题。 –

0

导入大型数据集时需要注意的事项。

  1. 内存需求。

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

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

    类< - sapply(initial,class);

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

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

  4. 在应用PCA之前执行维度降低技术。例如,删除高度相关的变量或nearZeroVariance变量,因为它们不会影响输出。

  5. 然后应用PCA。

我希望它能帮助