記錄近期小改K-Means至MapReduce上的心得

背景:

    在全部聚類算法中KMeans算是表面上最簡單的一種,沒有過多惱人的古希臘符號公式,沒有過度繁雜的公式嵌套。對於一個初學矩陣或者僅有向量概念的非專業人士的來講,不可不畏是一把踹門利器。這個世界上越是簡單的東西,其實越是複雜,尤爲在筆者將其改形成MapReduce時,發現並不是那麼容易一躍而過。雖然有現成的代碼供把玩,可是對於練手仍是值得一試。 算法

 

心得:

· 純理論一筆帶過 多線程

    KMean的大體實現過程就是任意指定N個的質心,而後對全部星星進行遍歷,尋找與這個N個質心距離最近歐幾里得距離的星星,將其歸爲一類,再從這一類中從新計算N個質心座標屬性。直至這N個質心座標變化DELTA小至本身設定的閥值。架構

· 一些心得 oop

  1. 網上對於KMEAN的算法有不少,大多數集中於(2質心+2維+單機)版本。要想支持(N質心+N維+MP)着實須要從新好好考慮程序架構,固然更NB者還能支持多線程。
  2. 嵌套問題是目前大多數非JAVA Hadoop計算的一道門檻,即使是JAVA類自己在JOB CHAIN上也經常會碰到傻傻分不清的狀況。對於10G以上數據如何在MP上發揮最大功效,就是減小JOB和TASK之間來回SHUFFLE。
  3. 既指望一次MP,完成整個運算,同時將負載儘量在Map階段進行壓榨。也所以,筆者在假設數據徹底散列的狀況下完成每組TASK的計算,已指望獲得N個K(質心)離開最終質心近似向量值。在Reduce階段粗暴地對N個K作歸類,再作算術平均,再作一把全兩項遍歷,最後得出N個類。難就難在對N個TASK的K作從新歸類
  4. 因爲主要經過Streaming來計算,整個對於Hadoop的I/O仍是有較大負荷。
  5. 下面兩幅圖簡單介紹下K-Means聚合過程。左邊是2個質心2維,右邊是3個質心2維。

                       

 

DATA:

 

X      Y
29    12
21    33
23    23
25    23
33    24
22    36
23    12
16    20
23    32
33    10
26    23
32    14
33    7
38    4
13    33
65    77
43    63
81    87
72    64
54    71
61    67
81    58
57    81
54    79
50    82
53    62
74    58
77    55
69    81
70    82
44    55
60    58
相關文章
相關標籤/搜索