7

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

我已经尝试使用该包bigmemory将文件作为.big.matrixprincompbig.matrixbig.matrixdata.frame

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

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

感谢您提供任何信息。

4

2 回答 2

10

我解决它的方法是通过迭代计算样本协方差矩阵。这样,您只需要任何时间点的数据子集。可以使用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 得到协方差。

当您拥有协方差矩阵时,只需调用并princomp自己跳过计算协方差矩阵。covmat = your_covmatprincomp

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

于 2012-10-01T10:09:34.987 回答
-1

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

  1. 内存要求。

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

    初始 <- read.table("datatable.csv", nrows = 100);

    类<- sapply(初始,类);

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

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

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

  5. 然后应用 PCA。

我希望它有帮助

于 2018-01-05T18:10:16.410 回答