2012-09-15 105 views
5

集做PCA我有一個CSV文件非常大的訓練集(〜2GB)。該文件是太大直接讀入內存(read.csv()帶來的計算機停頓),我想,以減少使用PCA數據文件的大小。問題在於(據我所知),我需要將文件讀入內存才能運行PCA算法(例如,princomp())。非常大的數據中的R

我曾嘗試bigmemory包讀取文件中的big.matrix,但princomp不會對big.matrix對象功能,它似乎並不像big.matrix可以轉換成有點像data.frame

在我錯過的大型數據文件上有沒有對princomp運行的方法?

我在R2上的相對新手,所以一些,這可能是顯而易見的經驗更豐富的用戶(在AVANCE道歉)。

感謝任何信息。

+0

基本上你需要做的PCA沒有估計樣本協方差矩陣。有關高維PCA的大量文獻,特別是在圖像處理和金融市場的應用方面。但是,這很可能不是一件微不足道的事情。 – John

+2

該文件包含多少個觀測值和多少個變量? – rolando2

+0

@ rolando2它包含大約50K行和大約10000列 – user141146

回答

8

我解決的方式是通過迭代地計算所述樣本協方差矩陣。通過這種方式,您只需要任何時間點的數據子集。可以使用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得到協方差。

當你擁有的協方差矩陣,只需要調用princompcovmat = your_covmatprincomp將跳過calulating協方差矩陣自己。

這樣您可以處理數據集是多少,比你的可用RAM大得多。在迭代過程中,內存使用量大致是塊需要的內存(例如,1000行),之後內存使用被限制爲協方差矩陣(nvar * nvar雙倍)。

+0

也許有一種方法不將所有的協方差矩陣存儲在內存中? – mrgloom

+0

如果你有一個新的問題,請創建一個新的問題,也許是指這個問題。 –

0

導入大型數據集時需要注意的事項。

  1. 內存需求。

  2. 瞭解數據集的結構被導入 使用以下示例代碼:

    初始< - 函數read.table( 「datatable.csv」,NROWS = 100);

    類< - sapply(initial,class);

    tabAll < - 函數read.table( 「datatable.csv」,colClasses =班)

  3. 如果數據集是大量使用的fread()從數據功能,表類。

  4. 在應用PCA之前執行維度降低技術。例如,刪除高度相關的變量或nearZeroVariance變量,因爲它們不會影響輸出。

  5. 然後應用PCA。

我希望它能幫助