2013-08-04 53 views
3

我想用kmeans將大數據矩陣(500萬x 512)聚類到5000箇中心。 我正在使用R爲了不使用這個矩陣來打擊我的記憶。kmeans with big data

我寫了這個代碼爲txt矩陣轉換成XDF然後集羣:

rxTextToXdf(inFile = inFile, outFile = outFile) 
vars <- rxGetInfo(outFile,getVarInfo=TRUE) 
myformula <- as.formula(paste("~", paste(names(vars$varInfo), collapse = "+"), sep="")) 

clust <- rxKmeans(formula = myformula, data = outFile,numClusters = 5000, algorithm =  "lloyd", overwrite = TRUE) 
write.table(clust$centers, file = centersFiletxt, sep=",", row.names=FALSE, col.names=FALSE) 

但它已經現在正在運行了一個星期。任何想法如何使其更快?

+0

看起來像是使用Revolution R而不是開源R.難以重現。計算機的規格是什麼? – dickoa

+0

英特爾i7 3630 2.4GHz 8 GB內存500 Gb硬盤窗口x64 – RamBracha

+0

我不使用Revolution,唯一的建議是我可以嘗試'bigmemory' +'biganalytics :: bigkmeans',但就我所知它不在Windows上工作(除非有人糾正我),所以如果你有機會訪問其他機器...... – dickoa

回答

7
  1. 你真的需要5000簇嗎? k-means性能隨着簇的數量而變化,所以你在那裏聚集了大量的簇會讓你自己受到很大的傷害。如果你能夠減少羣集的數量,那將會有很大的幫助。

  2. 您確定您需要全部512個尺寸?如果您可以修剪或合併一些可能有用的尺寸。你有沒有試過在你的數據上運行PCA?也許你可以嘗試在前10個組件上運行k-means或類似的東西。

  3. 是否必須是k-means?您可以嘗試其他算法,如層次聚類或自組織映射,看看這些算法執行速度是否更快。我建議以您的數據爲例(可能N = 100K),然後根據測試速度測試一些聚類算法。 K-means是一個非常簡單的實現算法:可能試着找到一個實現或者編碼一個更接近金屬的實現,比如C/C++或FORTRAN。

  4. 你跟蹤你的內存使用情況嗎?坦率地說,我懷疑你已經吹噓你的記憶。在一次迭代中,您要求您的計算機在512個維度之間建立500萬點之間的距離矩陣與每個5000個質心之間的距離矩陣。這意味着您的距離矩陣將爲5M x 5K x 512或1.28e13記錄(將其乘以數據類型的位編碼)。你只有6.9e10位的RAM。除非Revolution R做了一些非常鬼鬼祟祟的事情,否則根本不可能在硬件上解決這個問題,除非你購買方式更多的RAM。即使使用64 GB,您仍然比單個k-means迭代少幾個數量級。

  5. 你說你是爲了使用R鍵不吹你的內存使用情況:也許革命R是不同的,但現有的R確實一切在內存中,如我上述的,這個問題是不是真的在傳統硬件上容易處理。您應該考慮租用一些更強大的計算羣集,如亞馬遜EC2。

  6. k-means是其中一種算法,它是「難以理解的可對齊的」。如果你租用服務器空間,你可以在hadoop集羣上運行它,這應該會有很大的幫助。

  7. 你想在這裏完成什麼? 5000簇很多。 5000個集羣的預期含義是什麼?我懷疑這裏的真正解決方案不是更快的kmeans實現或更強大的硬件,而是反思你的問題以及你正在努力完成的任務。

+0

R中有像rxkmeans這樣的函數,用於從硬盤上的文件寫入和加載數據,這樣我就可以繞過內存問題。我有500 Gb的硬盤驅動器,這對計算來說已經足夠了。問題在於運行時間。我不想等待一個月的計算。 – RamBracha

+0

您是否確認過您的outfile(或其他R正用於將這些計算推送到磁盤的數據庫)是否已填充並繼續進行修改?我忍不住懷疑R被凍結。是否有一個輸出日誌文件可以引用來確認這實際上仍然在擠出並且不會停留在第一次迭代上? –

+3

項目#8是該地段最重要的問題,與#1有關。如果您研究一些像AIC或BIC這樣的指標,您可能會發現在5或10個集羣之後,您不會爲解決方案的質量添加任何內容。除非你有數據的系統真的有5000個離散狀態,否則你可能只是推動電子而沒有真正的好處。 –

4

如果您購買了RevoR,您還支付了支持費用。爲什麼不問他們?

0

如果您可以創建樣本來表示數據,則可以先對樣本進行聚類,然後使用分類技術在其上訓練模型,然後對剩餘數據的塊進行預測以分配聚類。

培訓模型還會告訴您哪些變量不重要,您可以通過這種方式降低維度。

爲什麼增加5m行x 512個特徵x 5000個簇的計算複雜度,當您通過處理這個問題可以得到更多的見解時?