6

我有同樣的問題,因爲在這個post,但我沒有足夠的積分,添加評論那裏。我的數據集有100萬行,100列。我也使用Mllib KMeans,它非常緩慢。這項工作實際上從來沒有完成,我必須殺死它。我在谷歌雲(dataproc)上運行它。如果我要求更少數量的羣集(k = 1000),它仍然運行,但仍需要超過35分鐘。我需要它運行k〜5000。我不知道它爲什麼這麼慢。考慮到工人/節點的數量,在一個100萬x 300,000列矩陣上需要大約3分鐘的時間,這些數據才能被正確分區,但是當涉及到KMeans時,它只會陷入黑洞。我現在嘗試更少的迭代次數(2次而不是100次),但是我覺得某處出了問題。爲什麼Spark Mllib KMeans算法非常慢?

KMeansModel Cs = KMeans.train(datamatrix, k, 100);//100 iteration, changed to 2 now. # of clusters k=1000 or 5000 
+0

將#迭代更改爲2沒有任何差別。 – Kai

+0

啓,我有一個[類似的問題](http://stackoverflow.com/questions/39260820/is-sparks-kmeans-unable-to-handle-bigdata)。但是,就我而言,這個工作簡直是掛了*,不僅僅是因爲它很慢。你是否會在工作中看到任何進步,而且速度會很慢,或者什麼也不做,就像我的情況一樣? – gsamaras

回答

5

看起來原因比較簡單。您使用相當大的k並將其與昂貴的初始化算法結合使用。

默認火花使用作爲K-means++稱爲K均值分佈變體|| (見What exactly is the initializationSteps parameter in Kmeans++ in Spark MLLib?)。分佈式版本大致爲O(K)所以對於較大的K,您可以預期較慢的開始。這應該解釋爲什麼當你減少迭代次數時你看不到改進。

採用大K是還貴時,模型訓練。 Spark正在使用Lloyds的一種變體,其大致爲O(nkdi)

如果你希望出現的數據結構複雜,很可能是一個更好的算法都來處理這個比K-均值,但如果你真的想堅持下去,你開始使用隨機初始化。

+0

你是說大部分時間都被這個「初始化」消耗掉了嗎? – Kai

+0

我在說這是一個昂貴的步驟,併爲您看到的行爲帳戶。但更重要的是,訓練具有數千個羣集的K-means不能很好地發揮作用。 – zero323

+0

只用5000卡斯特,隨機初始化,7分鐘內完成運行spark工作!真棒!現在我會去看報紙看看對準確性的影響。再次感謝您的回饋。至於聚類的數量,我認爲問題的維度更爲重要 - >在非常高的模糊中,每一點與其他點相比「遠」。對於超過執行速度的點數並不重要。 – Kai

1

請重的K-均值其他實現。有些人喜歡在ELKI的變體比星火更好方式,即使在只有一個CPU。您會驚訝地發現您可以從單個節點獲得多少性能,而無需轉向羣集!從我的實驗中,不幸的是,您至少需要一個100個節點的羣集才能勝過本地實施。我知道these C++ versions是多核心(但是是單節點),也許是現在可以找到的最快的K-means,但我還沒有嘗試過自己(儘管我的需要,ELKI版本是在我最大的數據集上幾秒鐘內完成)。

+0

我會看看,謝謝你指出這些。 – Kai