深入淺出Mahout K-means (PART 1)- 讓IRIS資料集上Mahout k-means

  • IRIS資料介紹與說明

IRIS資料集(http://archive.ics.uci.edu/ml/datasets/Iris)是過去幾年機器學習與資料探勘挺有代表性的資料料集,IRIS是一種花名,在中文上稱為-鳶尾花,其衍生不同的品種,在IRIS資料集中,就分為Iris Setosa、Iris Versicolour與Iris Virginica這三種花,在外觀上這三種花的樣子是可以透過肉眼分辨出來,然而,若要經過計算學習分出這三種類型,似乎就需要一些技巧,基本上可以從4個特徵進行分辨,包含:萼片長度(sepal length)、萼片高度(petal height)、花瓣長度(petal length)與花瓣高度(petal height)。

所以當看到IRIS資料集時,可以看到一行資料分別有五個值,分別為:萼片長度(sepal length)、萼片高度(petal height)、花瓣長度(petal length)、花瓣高度(petal height)、花的類型(class),取其中一筆資料,就可以看到-4.9,3.1,1.5,0.2,"Iris-setosa" 。

為什麼要介紹IRIS資料集?我們在做資料探勘的時候,都會有自己想要的資料特性,我們可參考IRIS資料集屬性呈現的格式,作為其他資料分析轉換的一個參考。

在IRIS資料集中,總共150筆資料,每筆資料有4個屬性,所以除了類別之外,我們可以透過

double[][] data = new double[150][4];

存放這些資料,然而這樣的做法當然不是最好的,因為在Big Data世界裡面,一般的資料大概都超過millions的資料量,屬性也可能不只是個位數,

詳細請參考:(http://zh.wikipedia.org/wiki/%E5%AE%89%E5%BE%B7%E6%A3%AE%E9%B8%A2%E5%B0%BE%E8%8A%B1%E5%8D%89%E6%95%B0%E6%8D%AE%E9%9B%86)

  • k-means群聚演算法簡介

k-means是一個簡單且實用的分群演算法,Stuart Lloyd 在1957年提出這個演算法迄今,已被應用於許多領域,雖然,這個演算法需先給定群聚數目這個特性,常常造成使用上的困難點,然而這無傷大雅,除了可以透過認知進行k值的估計,現今已有許多系統化分析的方法,無法直接估算出k值,並不會造成k-means演算法太多的負面影響。

K-means演算法首先會在一群資料點中,隨機依照k的值給予k個隨機的中心點,接著這些資料點會找尋最近隨機所產生的中心點計算其距離,再來依照各個中心點與各資料點距離的期望值,更新中心點的坐標,依照上述流程不斷的重複計算,直到新舊中心點的差異小於可接受門檻值,演算法即可完成。最後,依照以更新後k個中心點為每群的中心,並將每筆資料找出最鄰近的中心點,有相同最短距離中心點的資料點,即屬於同一群集。

  • Mahout群聚演算法的Java函式庫

在Mahout中對於k-means有兩種實作函式庫,一為KMeansClusterer,另一為KMeansDriver,這兩個類別都在org.apache.mahout.clustering.kmeans套件底下,KMeansCluster是in-memory版本,而KMeansDriver是MapReduced版本。我們就以KMeansCluster這個類別說起,你會需要下面這樣的語法,基本上就把群聚運算完了,Mahout的價值在這個地方就表露無遺了,你不需要再去重頭實作。

以Mahout 0.5為例,可參考下面的語法(http://archive.cloudera.com/cdh/3/mahout-0.5-cdh3u4/mahout-core/org/apache/mahout/clustering/kmeans/KMeansDriver.html):

public static void run( org.apache.hadoop.conf.Configuration conf, org.apache.hadoop.fs.Path input, org.apache.hadoop.fs.Path clustersIn, org.apache.hadoop.fs.Path output, DistanceMeasure measure, double convergenceDelta, int maxIterations, boolean runClustering, boolean runSequential )

舉例:

KMeansDriver.run(

conf,

new Path(“testdata/points"),

new Path(“testdata/clusters"),

new Path(“output"),

new EuclideanDistanceMeasure(),

0.001,

10,

true,

false

);

我們再復習一次,進行k-means運算需要的input包含:(1) 資料點:new Path(“testdata/points") (2) 中心點: new Path(“testdata/clusters") (3) 距離運算方式: new EuclideanDistanceMeasure() (4) 迭代停止條件: 0.001 (5) 迭代次數:10。此外,因為這是分散式實作,我們必須給予Hadoop的設定檔(conf),以及在時做完這個演算法是否要直接把群聚結果:true,最後群聚演算法需要決定是否要採用循序化的群聚方式(最後一個參數): false

基本上,如果真的要探究k-means群聚的核心,就上面這個方法,然而,比較需要花功夫的是:(1) 如何產生上面的Input、(2) 如何取得計算後的Output、(3) 如何選擇適合的距離公式、(4) 如何設定合適的參數值、(5) 如何選擇合適的k值(進階議題)。

Stay tuned~

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s