【问题标题】:doing PCA on very large data set in R在 R 中对非常大的数据集进行 PCA
【发布时间】:2012-09-22 03:59:25
【问题描述】:

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

我已经尝试使用bigmemory 包将文件作为big.matrix 读取,但princompbig.matrix 对象不起作用,而且big.matrix 似乎无法转换为某种东西比如data.frame

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

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

感谢您提供任何信息。

【问题讨论】:

  • 基本上你需要在不估计样本协方差矩阵的情况下进行 PCA。有大量关于高维 PCA 的文献,特别是在图像处理和金融市场的应用。然而,这很可能不是一件小事。
  • 文件包含多少个观察值和多少个变量?
  • @rolando2 它包含大约 50K 行和 ~10000 列
  • 它应该适合内存(前提是你有一台功能相当强大的计算机——我的意思是 >=4GB RAM ob board)——检查你是否没有将它作为字符串数组读取(即将前 100 行剪切为单独的文件,并检查是否可以将其直接导入为数字)。
  • 如果您的问题是将数据加载到 R 中,或者只是为高维数据寻找有效的 PCA 算法,请更清楚地说明。

标签: r bigdata pca


【解决方案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 得到协方差。

当您拥有协方差矩阵时,只需使用covmat = your_covmat 调用princompprincomp 将跳过自己计算协方差矩阵。

通过这种方式,您可以处理的数据集比您的可用 RAM 大得多。在迭代过程中,内存使用量大致是块占用的内存(例如 1000 行),之后内存使用量被限制为协方差矩阵(nvar * nvar 双倍)。

【讨论】:

  • 也许有办法不将所有协方差矩阵存储在内存中?
  • 如果您有新问题,请创建一个新问题,可能参考这个问题。
【解决方案2】:

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

  1. 内存要求。

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

    初始

    tabAll

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

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

  5. 然后应用 PCA。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2014-03-25
    • 2012-10-22
    • 2011-05-19
    • 2012-08-25
    • 1970-01-01
    • 2019-08-02
    • 2023-03-14
    • 2022-01-11
    相关资源
    最近更新 更多