加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 04:35:18 所属栏目:大数据 来源:网络整理
导读:我在CSV文件中有一个非常大的训练集(~2Gb).该文件太大而无法直接读入内存(read.csv()使计算机停止运行)我希望使用PCA减小数据文件的大小.问题是(据我所知)我需要将文件读入内存以运行PCA算法(例如,princomp()). 我已经尝试过bigmemory包来作为big.matrix读取
我在CSV文件中有一个非常大的训练集(~2Gb).该文件太大而无法直接读入内存(read.csv()使计算机停止运行)我希望使用PCA减小数据文件的大小.问题是(据我所知)我需要将文件读入内存以运行PCA算法(例如,princomp()).

我已经尝试过bigmemory包来作为big.matrix读取文件,但是princomp不能在big.matrix对象上运行,它看起来不像big.matrix可以转换成类似data.frame的东西.

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

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

谢谢你的任何信息.

解决方法

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

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

>打开文件连接(con = open(…))
>读取1000行(readLines(con,n = 1000))
>计算每列的平方和
>将这些平方和添加到变量(sos_column = sos_column new_sos)
>重复2-4直到文件结束.
>除以行数减去1得到均值.

计算协方差矩阵:

>打开文件连接(con = open(…))
>读取1000行(readLines(con,n = 1000))
>使用crossprod计算所有交叉产品
>将这些交叉产品保存在变量中
>重复2-4直到文件结束.
>除以行数减1以得到协方差.

当你有协方差矩阵时,只需用covmat = your_covmat调用princomp,princomp将跳过自己计算协方差矩阵.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读