我正在嘗試R包apcluster
上我想要羣集的對象,但我遇到性能/內存問題,並且我懷疑我做得不對。我想聽聽你的意見。關於大型稀疏矩陣上的親和力傳播聚類
總之:我有一套約13000個對象。每個對象都與一組2到5個「特徵」相關聯。任何兩個對象i和j之間的相似性(最終我想要聚類)等於它們共有的特徵數量除以它們「跨越」的不同特徵的總數量。例如。如果i = {a,b,c}和j = {c,d},那麼sim [i,j] = 1/4 = 0.25,因爲它們只有1個共同特徵({c}),描述4個不同的特徵({a,b,c,d})。
計算我的NxN相似度矩陣不是問題理論上:如果每個對象的特徵都作爲列表存儲,則可以使用集合操作完成;或特徵可以旋轉到1和0的矩陣,其中每列是一個特徵,然後R的函數dist
與method="binary"
有訣竅。
然而,在實踐中然而,第一個問題是這種相似性計算非常慢。對於13 K的物體,計算的相似度大約爲84.5 M,但對於現代計算機來說,這聽起來不那麼糟糕。我不明白爲什麼需要幾個小時才能做到這一點。而據我所知,設置的操作版本應該更快,實際上比dist
慢得多。 [另一個名爲fingerprint
的軟件包應該可以更有效地處理這種情況,但到目前爲止,我還沒有能夠使其工作,但在嘗試製作他們稱之爲「featvec」對象時出現了很多錯誤)。
要考慮的另一件事是每個對象2-5個特徵不是很重複。可能有一組100個左右的對象,它們之間至少有一個共同的特徵,但是其他12.9個K對象沒有任何特徵與這100個對象有共同之處。結果是旋轉的特徵矩陣非常稀疏(如果我們認爲0是空的)。樞軸矩陣中有大約4000列,每行至多有5個1。我想知道這是否會對dist
的性能產生負面影響,因爲它必須乘以很多0才能被忽略。
對於像你所描述的那個矩陣應用
dist
需要幾個小時的時間,對你來說這是否正常?你能否提出一種不同的方法來計算利用矩陣稀疏性的相似性?
無論如何,我設法從dist
,然而有類「DIST」得到的輸出,並且是距離矩陣,而不是相似,所以我只好用1 - as.matrix(distance_matrix)
才能夠使相似矩陣apcluster
需要作爲輸入。
那是當我得到第一個'記憶'問題。 R表示,由於它的大小,矢量不能被分配。我嘗試了通常的技巧,但最終我無法獲得超過4 GB的性能,而且我的矩陣(顯然)更大。
我克服了這一點,每次將新的矩陣分配給舊的「自我」。
然後當我提交這個辛辛苦苦的相似度矩陣到apcluster
時,再次出現矢量大小錯誤,就好像apcluster
所做的第一件事是從我所餵食的東西中創建了一些其他大對象。
我看過as.Sparse...
在apcluster
,但它似乎沒有什麼幫助,考慮到你必須首先計算全矩陣。
最後,唯一有效的工作是apclusterL
的「槓桿親和力傳播」,但這是近似值。
有沒有人知道我是否可以做得更好?例如。首先轉換數據是明智的,還是應該堅持列表並設置操作?或者,可以將初始矩陣稀疏的事實用於直接計算稀疏矩陣,而不是完全計算並將其減少到稍後稀疏?
任何意見將不勝感激。謝謝!
順便說一句,是的,我看到這個線程:Cluster Analysis in R on large sparse matrix;這似乎沒有得到有力的回答。
謝謝!在此期間,我發現我的R工作室運行的是R的錯誤版本;我切換到64位版本,約8 GB的內存。它現在能夠處理我的矩陣。仍然很慢,但至少它不會崩潰,我不需要使用槓桿方法。我還發現如何編寫自定義相似度矩陣函數,我可以直接在'apcluster'中使用,而不生成中間矩陣。我會看看我是否可以執行你的建議。 – user6376297