簡體   English   中英

如何在沒有 memory 錯誤的情況下使用 Python 或 R 對大數據進行聚類?

[英]How to cluster big data using Python or R without memory error?

我正在嘗試對包含大約 1,100,000 個觀察值的數據集進行聚類,每個觀察值具有三個值。

R中的代碼非常簡單:

df11.dist <-dist(df11cl) ,其中 df11cl 是 dataframe 具有三列和 1,100,000 行,並且此數據框中的所有值都是標准化的。

我得到的錯誤是: Error: cannot allocate vector of size 4439.0 Gb

對類似問題的建議包括增加 RAM 或分塊數據。 我已經有 64GB RAM,而我的虛擬 memory 是 171GB,所以我不認為增加 RAM 是一個可行的解決方案。 此外,據我所知,分層數據分析中的分塊數據會產生不同的結果。 因此,使用數據樣本似乎是不可能的。

我也找到了這個解決方案,但答案實際上改變了問題。 他們在技術上建議 k-means。 如果事先知道集群的數量,K-means 就可以工作。 我不知道集群的數量。 也就是說,我使用不同數量的集群運行 k-means,但現在我不知道如何證明選擇一個到另一個是合理的。 有什么可以幫助的測試嗎?

您能推薦Rpython中的任何內容嗎?

由於瑣碎的原因,function dist需要二次 memory。

因此,如果您有 100 萬 (10^6) 個點,則二次矩陣需要 10^12 個條目。 使用雙精度,每個條目需要 8 個字節。 有了對稱性,您只需要存儲一半的條目,仍然是 4*10^12 字節,即 4 TB 僅用於存儲此矩陣。 即使您將其存儲在 SSD 上或將系統升級到 4 TB RAM,計算所有這些距離也將花費大量時間。

100萬仍然很小,不是嗎?

在大數據上使用dist是不可能的。 故事結局。

對於更大的數據集,您需要

  • 使用不使用成對距離的方法,例如 k-means
  • 使用不需要距離矩陣的 DBSCAN 等方法,在某些情況下,索引可以將工作量減少到 O(n log n)
  • 對數據進行二次采樣以使其更小

特別是如果您還沒有可行的解決方案,最后一件事是個好主意。 與不起作用的方法的可伸縮性作斗爭是沒有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM