1. 程式人生 > >mahout in Action2.2-聚類介紹-K-means聚類算法

mahout in Action2.2-聚類介紹-K-means聚類算法

過程 swing 浪漫 res cto 等等 算法 結合 -m

聚類介紹 本章包含

1 實戰操作了解聚類

2.了解相似性概念

3 使用mahout執行一個簡單的聚類實例

4.用於聚類的各種不同的距離測算方法

作為人類,我們傾向於與誌同道合的人合作—“鳥的羽毛聚集在一起。

我們可以發現反復的模式通過聯系在我們的記憶中的我們看到的、聽到的、問道的、嘗到的東 西。 比如,相比較鹽 ,糖可以是我們很多其它地想起蜜。所以我們把糖和蜜的味道結合起來叫他們甜蜜。

甚至我們不知道甜蜜的味道,可是知道他跟世界上全部的含糖的東西是相似的。是同 一類的。我們還知道它與鹽是不同類的東西。無意中。我們不同的味道使用了聚類。把糖和鹽做了聚類。每一個組有數百個項目。

在自然界中,我們觀察不同類型的群體。

覺得猿與猴是同一種靈長類動物。

全部的猴子 都有一些性狀如短高度,長尾巴,和一個扁平的鼻子。相反。猿類有較大的尺寸,長長的手臂,和更大的頭。猿看起來不同於猴子,但都喜歡香焦。所以我們能夠認 為猿和猴子作為兩個不同的組,或作為一個單一的愛香蕉的靈長類動物群。我們考慮一個集群全然取決於我們選擇的項目之間的相似性測量的特點(在這樣的情況下, 靈長類動物)。

在這一章中,從mahout學習的聚類的樣例中。我們將會知道聚類是什麽。怎樣有數據概念聯系起來。讓我們從基礎開始吧!

7.1 聚類的基礎

聚類的過程是怎麽樣的呢

?假如你能夠去有成千上萬的書籍的圖書館。在圖書館內 ,圖書是雜亂無章的。要找到想讀的書必須橫掃全部的書籍,一本一本的才幹特定的書。這不僅是繁瑣和緩慢。並且很枯燥。

依照標題的字母順序排序會對讀者通過標題尋找有非常大的幫助,假設大多數人僅僅是簡單地瀏覽一下。僅僅是找一個大概的主題的書籍呢?這樣通過依照書籍的主題進 行分類要比依照標題的字母順序更實用。可是怎樣進行分組呢?剛剛接手這份工作。你也不會知道全部的書籍是什麽的?是沖浪的、浪漫的。或你沒有遇到過的課 題。

通過按主題把書籍分類。你不得不把全部書放在同一線上,一本一本的開始閱讀。當你遇到一本書的內容是類似曾經的一本書,你就返回去把它們放在在一起。當你完畢,你從數千上萬的書中獲取到你要的主題的一堆書。

幹得好!這是你的第一個聚類的經驗。假設一百個主題組太多了。你就得從頭開始和反復剛才的過程獲得書堆。直到你的主題,從還有一個堆是全然不同的。

聚類是全部關於組織項目從一個給定集合成一組類似的項目。在某些方面。這些集群能夠被覺得是作為項目相似集,可是與其它集群項目不同的。

聚類集合包括三項

算法 ———–這是用來組書籍的方法

相似性和差異性的概念——-一個在前面討論的,依賴於這本書是否屬於已經存在的堆。還是應 該另組新一堆的推斷。

終止條件———圖書館的樣例中。當達到這些書不能堆積起來了,或這些堆已經相當不同的。這就是終止

在這個簡單的樣例中,圈出來的顯然是基於距離三個集群。代表了聚類的結果。圓是一個在聚類方面是一個非常好的方法。

因為群組通過中心點和半徑來定義的,圓的中心被叫為群重心。或者群平均(平均值),群重心的坐標是類簇中的全部點的x,y軸的平均值

項目的相似性測量

技術分享

7.1x-y平面圖的點。圓圈代表了聚類。在平面團中的點歸類了單個邏輯群組。聚類算法故意於識別群組

在本章中,我們將聚類可視化為一個幾何問題。

聚類的核心是使用幾何的技術表達不同距離的測算。

我們找到一些重要的距離測算法和聚類關系。

平面聚類點與文本聚類之間的詳細相似性就能夠抽象出來。

在後面的章節中。我們探討了廣泛用於聚類的方法數據,以及mahout 中使用

方法。

圖書館的樣例是將書分堆直到達到一定閾值的一種策 略。

在這個樣例中形成的簇的數目取決於數據;基於很多書和臨界值,你可能發現了100後者20。甚至是1個類簇。一個更好的策略是建立目標簇,而不是一個 臨界值,然後找到最好的群組與約束。接下來我們將具體的介紹目標簇和不同的變量

7.2項目的相似性測量

聚類的重要問題是找到一方法。通過不論什麽兩個數中的一個數來量化相似性。註意一下我們整片文章中使用的專業術語 :項目和點,這兩個是聚類數據的單位。

X-Y平面的樣例,相似性的度量(相似性度量)的分為兩個點之間的歐幾裏德距離。

圖書館的樣例沒有這樣的清晰的數學手段,而不是全然依賴的智慧館員之間的相似度來推斷書。這工作不在我們的案例,由於我們須要一個度量。可在計算機上實現.

一個可能的度量是基於兩本書的標題共同含有的詞的數量。

基於哈利·波特:哲學家的石頭和哈利·波特這兩本書:阿茲卡班的囚徒中常見的三個詞:哈利、波特、the

即時魔戒也:兩塔是類似於哈利·波特系列。這一措施相似不會捕獲這一切。你須要改變的相似性度量來對書籍本身的內容帳戶。

你能夠將單詞計數。

僅僅可惜。說的easy做起來難。

這些書不僅有幾百個網頁的文本。並且英語的特點也使的分類方法更加困難。在英語文本中有一些非常頻繁的次比如 a,an ,the 等等。它總是常常發生但又不能說明這是這兩本書的相似點。

為了對抗這樣的影響。你能夠在計算中使用的加權值,而且使用低權重表示這些詞來降低對相似度值的影響。

在出現非常多次的詞使用低權重值,出現少的用高權重。你能夠衡量一個特定的書常常出現的,比方那些強烈建議內容的書籍類似於魔術類的哈利波特。

你給書中的每個單詞一個權重。就能算出這本中的相似性就是全部詞的詞頻乘以每個詞的權重的和。

假設這兩本書的長度同樣,那麽這個就是一個比較適當的方法。

假設一本書有300頁,還有一本有1000頁呢?當然書頁大的書的詞也多。


聚類算法

9.1 K-means聚類

K-means須要用戶設定一個聚類個數(k)作為輸入數據,有時k值可能很大(10,000),這是Mahout閃光的(shines)地方,它確保聚類的可測量性。

為了用k-means達到高質量的聚類,須要預計一個k值。預計k值一種近似的方法是依據你須要的聚類個數。比方100萬篇文章,假設平均500篇 分為一類,k值能夠取20001000000/500)。

這樣的預計聚類個數很模糊。但k-means算法就是生成這樣的近似的聚類。

9.1.1 All you need to know about k-means

以下看一下k-means算法的細節,K-means算法是硬聚類算法。是典型的局域原型的目標函數聚類方法的代表,它是數據點到原型的某種距離作 為優化的目標函數,利用函數求極值的方法得到叠代運算的調整規則。

算法採用誤差平方和準則函數作為聚類準則函數。

K-means算法是非常典型的基於距離的聚類算法,採用距離作為相似性的評價指標。即覺得兩個對象的距離越近,其相似度就越大。該算法覺得簇是由距離靠近的對象組成的。因此把得到緊湊且獨立的簇作為終於目標。k個初始類聚類中心點的選取對聚類結果具有較大的。

算法步驟:

1)隨機選取隨意k個對象作為初始聚類中心,初始代表一個簇。

2)計算點到質心的距離,並把它歸到近期的質心的類。

3)又一次計算已經得到的各個類的質心;

4)叠代2~3步直至新的質心與原質心相等或小於指定閾值。算法結束。

技術分享

這樣的兩步算法是最大期望算法(EM)的典型樣例,

第一步是計算期望(E)。利用對隱藏變量的現有預計值,計算其最大似然預計值;

第二步是最大化(M)。最大化在 E 步上求得的最大似然值來計算參數的值。

M 步上找到的參數預計值被用於下一個 E 步計算中,這個過程不斷交替進行。

9.1.2 Running k-means clustering

K-mean聚類用到KMeansClustererKMeansDriver類。前一個是在內存(in-memory)裏對節點聚類。後者採用 MapReduce任務運行。

這兩種方法都能夠就像一個普通的Java程序運行,而且能夠從硬盤讀取和寫入數據。

它們也能夠在hadoop上運行聚類。通 過分布式文件系統讀寫數據。

以下舉例,使用一個隨機點生成器函數來創建一些點。

這些點生成矢量格式的點作為一個正態分布環繞著一個中心。使用Mahoutin-memory K-means 聚類方法對這些點聚類。

創建節點:generateSamples方法,取(1,1)為中心點。標準差為2,400個環繞著(1,1)的隨機點,近似於正態分布。

另外又取了2個數據集。中心分別為(1,0)和(0,2)。標準差分別為0.50.1

KMeansClusterer.clusterPoints()方法用到一下參數:

  • List<Vector>作為輸入。
  • 距離算法DistanceMeasure採用EuclideanDistanceMeasure
  • 聚類的閾值Threshold0.01
  • 聚類的個數為3
  • 聚類的中心點採用RandomPointsUtil。隨機選取的節點。

技術分享

技術分享

Mahout-example裏的DisplayKMeans類能夠直觀的看到該算法在二維平面的結果。9.2節將介紹執行一個Java Swing applicationDisplayKMeans

假設數據量非常大時,應採取MapReduce執行方式,將聚類算法執行在多個機器上,每一個mapper得到一個子集的點,每一個子集執行一個mapper。這些mapper任務計算出近期的集群作為輸入流。

K-means聚類的MapReduce Job

採用KMeansDriver類的run()方法,須要輸入的參數有:

  • Hadoop的配置conf
  • 輸入Vectors的路徑。SequenceFile格式;
  • 初始化聚類中心的路徑,SequenceFile格式;
  • 輸出結果的路徑,SequenceFile格式;
  • 求相似距離時採用的方法。這裏採用EuclideanDistanceMeasure
  • 收斂的閾值,沒有超過該閾值的點可移動時,停止叠代。
  • 最大叠代次數,這是硬性限制,到達該最大叠代次數時,聚類停止;
  • true-叠代結束後聚類。
  • true-串行運行該算法,false-並行運行該算法;

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

技術分享

採用SparseVectorsFromSequenceFile工具,將sequenceFile轉換成Vector。由於K-means算法須要用戶初始化k個質心。

mahout in Action2.2-聚類介紹-K-means聚類算法