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

时间:2012-09-15 01:23:51

标签: r bigdata pca

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

我已尝试bigmemory包以big.matrix的形式阅读该文件,但princomp无法在big.matrix个对象上运行,看起来不像big.matrix可以转换为类似data.frame的内容。

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

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

感谢您的任何信息。

2 个答案:

答案 0 :(得分:10)

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

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

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

    1. 打开文件连接(con = open(...)
    2. 阅读1000行(readLines(con, n = 1000)
    3. 使用crossprod
    4. 计算所有交叉产品
    5. 将这些叉制品保存在变量中
    6. 重复2-4直到文件结束。
    7. 除以行数减1以得到协方差。
    8. 如果您有协方差矩阵,只需使用princomp调用covmat = your_covmatprincomp将跳过自己计算协方差矩阵。

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

答案 1 :(得分:0)

导入大型数据集时要记住的事项。

  1. 内存要求。

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

    initial< - read.table(“datatable.csv”,nrows = 100);

    classes< - sapply(initial,class);

    tabAll< - read.table(“datatable.csv”,colClasses = classes)

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

  4. 在应用PCA之前执行降维技术。例如,删除高度相关的变量或nearZeroVariance变量,因为它们对输出没有贡献。

  5. 然后申请PCA。

  6. 我希望它有所帮助