Mahout學習之聚類演算法Kmeans

Thinkgamer_gyt發表於2015-10-23

一:kMeans演算法介紹

        聚類分析是一種靜態資料分析方法,常被用於機器學習,模式識別,資料探勘等領域。通常認為,聚類是一種無監督式的機器學習方法,它的過程是這樣的:在未知樣本類別的情況下,通過計算樣本彼此間的距離(歐式距離,馬式距離,漢明距離,餘弦距離等)來估計樣本所屬類別。從結構性來劃分,聚類方法分為自上而下自下而上兩種方法,前者的演算法是先把所有樣本視為一類,然後不斷從這個大類中分離出小類,直到不能再分為止;後者則相反,首先所有樣本自成一類,然後不斷兩兩合併,直到最終形成幾個大類。 

常用的聚類方法主要有以下四種:   //照搬的wiki,比較懶...

Connectivity based clustering  (如hierarchical clustering 層次聚類法)

Centroid-based clustering  (如kmeans)

Distribution-based clustering

Density-based clustering

  Kmeans聚類是一種自下而上的聚類方法,它的優點是簡單、速度快;缺點是聚類結果與初始中心的選擇有關係,且必須提供聚類的數目。Kmeans的第二個缺點是致命的,因為在有些時候,我們不知道樣本集將要聚成多少個類別,這種時候kmeans是不適合的,推薦使用hierarchical 或meanshift來聚類。第一個缺點可以通過多次聚類取最佳結果來解決。

  Kmeans的計算過程大概表示如下

隨機選擇k個聚類中心. 最終的類別個數<= k

計算每個樣本到各個中心的距離

每個樣本聚類到離它最近的中心

重新計算每個新類的中心

重複以上步驟直到滿足收斂要求。(通常就是中心點不再改變或滿足一定迭代次數).

二:Mahout實現

1.資料準備

仿造資料1.txt

8 8

7 7

6.1 6.1

9 9

2 2

1 1

0 0

2.9 2.9

2.txt

8.1 8.1

7.1 7.1

6.2 6.2

7.1 7.1

2.1 2.1

1.1 1.1

0.1 0.1

3.0 3.0

2.將資料轉換為序列檔案

方法1:命令列轉換,具體參考:點選開啟連結

方法2:程式碼轉換,可借用canopy演算法中的程式碼,具體參考:點選開啟連結

3.執行

bin/mahout kmeans -i /yourFilePath -o /yourFileOutputPath -c /yourStartCenter -k 2 -x 5 -cl

引數意義說明:

-i 設定檔案輸入路徑, -o 為檔案輸出路徑  -c 為初始輸入聚類中心 -k 表示聚類的數目 -x 表示最大的迴圈次數 -cl 表示演算法完成後進行原始資料的分類

4.結果分析

因為k值為2,所以在clusters-0中有兩個聚類中心檔案

初始化聚類中心為[2.0,2.0]  [2.1,2.1]

clueters-1和cluster-2的輸出為[1.033,1.033] [5.725,5.725]  ,   [1.525,1.525]  [7.325,7.325]

最後的聚類中心是[1.525,1.525]  [7.325,7.325]

使用此聚類中心對資料進行聚類,得到clusteredPoints資料夾下邊的檔案

相關文章