我在CSV文件中有一个非常大的训练集(~2Gb)。文件太大直接读入内存(read.csv()
使计算机停止运行)我希望使用PCA减小数据文件的大小。问题是(据我所知)我需要将文件读入内存才能运行PCA算法(例如princomp()
)。
我已尝试bigmemory
包以big.matrix
的形式阅读该文件,但princomp
无法在big.matrix
个对象上运行,看起来不像big.matrix
可以转换为类似data.frame
的内容。
有没有办法在我丢失的大型数据文件上运行princomp
?
我是R的相对新手,所以对于经验丰富的用户来说,其中一些可能是显而易见的(道歉)。
感谢您的任何信息。
答案 0 :(得分:10)
我解决它的方法是迭代计算样本协方差矩阵。通过这种方式,您只需要任何时间点的数据子集。只需读取数据的子集就可以使用readLines
来完成,您可以打开与文件的连接并迭代读取。该算法看起来像(这是一个两步算法):
计算每列的平均值(假设是变量)
con = open(...)
)readLines(con, n = 1000)
)sos_column = sos_column + new_sos
)计算协方差矩阵:
con = open(...)
)readLines(con, n = 1000)
)crossprod
如果您有协方差矩阵,只需使用princomp
调用covmat = your_covmat
,princomp
将跳过自己计算协方差矩阵。
通过这种方式,您可以处理的数据集比可用的RAM大得多。在迭代期间,内存使用大致是块所占用的内存(例如1000行),之后内存使用仅限于协方差矩阵(nvar * nvar加倍)。
答案 1 :(得分:0)
导入大型数据集时要记住的事项。
内存要求。
了解导入数据集的结构 使用以下示例代码:
initial< - read.table(“datatable.csv”,nrows = 100);
classes< - sapply(initial,class);
tabAll< - read.table(“datatable.csv”,colClasses = classes)
如果数据集很大,请使用数据,表类中的fread()函数。
在应用PCA之前执行降维技术。例如,删除高度相关的变量或nearZeroVariance变量,因为它们对输出没有贡献。
然后申请PCA。
我希望它有所帮助