Mining Massive Datasets課程筆記(五)聚類算法

Clustering

Overview of methods

首先我們說幾個典型應用,瞭解爲什麼需要聚類算法,然後介紹下聚類的集中方法,具體的細節在後面的小節中詳細說。
這裏寫圖片描述
但是在實際應用中,聚類問題並沒有圖中這麼簡單,往往有大量的數據,且數據時高維的(10 or 10,000dimensions)處理起來比較複雜,而且在高維空間中點間的距離看起來都是近似的。
Some Clustering Applications

  • clustering sky objects
  • clustering CD’s
  • clustering documents
    聚類分析試圖將相似對象歸入同一簇,將不相似的對象歸到不同簇。相似這一概念取決於所選的相似度計算方法,到底使用哪種相似度計算方法取決於具體應用。

Distance Measurement
對物品的不同表示方法,對應的距離度量方式也不同:
這裏寫圖片描述

Overview:Methods of Clustering

  • 層次法(Hierarchical)
    • 凝聚式Agglomerative (bottom up)
      每個點都初始化爲一個“簇”,重複地將具有最近距離的兩個簇合併成一個
    • 分裂式Division (top down)
      將整個分佈作爲一個簇,然後根據距離重複分裂爲不同的簇
  • 點分配法(Point Assignment)
    保留一些列的簇,將點劃分到距離最近的簇中。

層次聚類(Hierarchical Clustering)

我們主要講凝聚式的層次聚類。僅適用於小型數據集。
主要操作:重複地將距離最近的簇進行合併操作。
因此,對於層次聚類算法,我們必須確定一下幾個問題:
Three Problems:

  1. 簇如何表示?
  2. 如何選擇進行合併的簇?
  3. 簇的合併操作合適停止(停止條件)?

首先我們從較簡單的歐式空間討論層次聚類問題,然後一一解答上面的問題。
歐式空間
1. 在歐式空間中用質心(centroid)來表示簇,即簇中點的平均。
2. 計算簇的質心間的距離來表示簇間距離
3. 我們可以聚類到只剩一個簇爲止,然而返回一個簇並沒有實際意義,但是,合併的過程可以通過樹形來表示,這種合併過程的表示往往具有很強的實際意義。當然,我們也可以通過實現指定簇的數目或者是指定最小確信距離等方法來確定停止條件。具體地後面講解。

非歐式空間
在非歐式空間中,點集沒有質心的概念,因此無法通過質心來表示cluster,因此我們從簇中選擇一個點來代表簇,該點應該是距離簇內所有的點最近的點,稱之爲簇的中心(clustroid)。
然後簇間的距離計算和質心的距離計算一樣,通過計算中心點間的距離來表示簇間距離。

下面這張圖可以形象地說明質心和中心的區別:
這裏寫圖片描述

那麼我們如何來定義這個中心點呢?
我們說clustroid = point “closest” to other points. 那麼我們如何定義這個closest呢?
選擇中心點的方法,使得選出的點如下值最小 :

  • 該點到簇中另外一點的最大距離(maximum)
  • 該點到簇中其它各點的平均距離(avg)
  • 該店到簇中其它各點的距離平方和(sum of squares)

前面我們已經討論了前兩個問題的解決,下面我們說第三條,也就是簇合並的停止條件如何確定。

停止條件(Termination Condition)

  1. 選擇k個簇,當合併到k個時停止。前提是我們確信數據集的簇的數目。
  2. 如果在某個點時,現有簇的最佳合併會產生一個不恰當的簇時停止合併。i.e, a “bad” cluster.這裏對於簇的好壞使用”cohesion“進行度量,當低於某個cohesion值時則認爲是不恰當的簇。

Cohesion的定義

  1. 簇的直徑:簇中任意兩點之間的最大距離
    我們可以設置爲,當合並後的簇的直徑大於某個閾值時,停止合併,半徑同理。
  2. 簇的半徑:簇中任意一點到質心(中心)的最大距離
  3. 基於密度的方法:簇的單位體積中點的數目。
    當密度低於某個閾值時停止合併。

Implementation

定義兩個簇的距離爲兩個簇中所有點對之間的平均距離,其中計算距離的兩個點分別屬於不同的簇。然後選取距離最近的合併。
時間複雜度爲O(N3)
使用優先隊列進行優化後能減少到O(N2logN)
這對於大數據集特別是內存存儲不了的數據集而言,時間開銷仍然太大,因此對於大數據集我們要採取新的方法。

K均值算法(The K-Means Algorithm )

我們假設是在歐式空間中使用歐式距離來度量。

首先我們需要確定類的數目k,然後創建k個點作爲起始的簇的質心(通常是隨機的選擇)。
while(任意一個點的簇分配結果發生改變)do:
    爲每個點計算它的最近的質心,將其歸爲最近的那一簇。
    計算完所有的點所屬的簇後,更新k個簇的質心。

收斂條件是所有的點的分配不再發生改變,即質心穩定。
總體的流程很容易理解,那麼這個k值我們應該如何選擇,k個初始簇的質心如何確定呢?
Picking the right value for k
嘗試不同的k值,觀察隨着k的增長,點到質心的平均距離的變化。
如果能夠對不同的k下聚類結果的質量進行評價,我們就可以猜測到正確的k值。試想如果我們給定了合適的k值(甚至是更大的)那麼簇的評價指標(如簇直徑)將會上升的非常緩慢,但是,一旦k值小於真是數目,簇直徑就會急劇增大,用圖來表示如下:
這裏寫圖片描述

Picking the initial k points
對於初始的k個簇,如何選擇這k個質心呢:

  1. 採用層次聚類算法輸出k個簇,在每個簇中選擇離質心最近的點。
    前面我們說到層次聚類僅適用於小型數據,因此我們首先需要對數據進行採樣,採樣後的數據能存入內存,然後對採樣後的數據進行層次聚類,聚類到k類後選擇質心。
  2. 選擇彼此距離儘可能遠的k個點。
    首先隨機挑選一個點

     while 挑選的點數目<k,do:
        選擇使該點到selected points們的最小距離儘可能大的點作爲下一個selected point
    

    有點拗口,但很好懂,其實就是找最分散的k個點,這樣的選擇方式和初始的第一個點的選擇關係比較大,會隨着第一點的選擇的不同而有所不同。

k均值的算法細節很簡單,已經說完了,下面看複雜度:
雖然每一次計算點的分配情況以及重新計算質心只需要O(kN) ,但是由於需要迭代進行至收斂,因此時間消耗依然很長,我們能否找到一種類似的k均值算法,使得對數據的一次瀏覽就可以完成聚類呢?也就是我們下面要將的BFR算法,名詞由來是三個發明這個算法的人(Bradley-Fayyad-Reina),適用於大型數據集。

BFR 算法

BFR算法時k均值算法的一個變形。BFR算法對簇的形狀給出了一個非常強的假定,即它們必須滿足以質心爲期望的正態分佈(Normally Distributed)。
這裏寫圖片描述

一個簇在不同維度下的均值和標準差可能不同,但是維度之間必須相互獨立 滿足正態分佈的假設說明每個簇看上去應該都是軸平行的橢圓形狀。如下圖綠色部分表示y維度上的標準差比較大,因此分佈會沿y軸平行展開。
這裏寫圖片描述

BFR Algorithm:Overview

這裏寫圖片描述
我們說過BFR算法用來處理大型數據集,因此數據文件中的點按照組塊的方式讀入,如分佈式文件系統中的chunk組塊或者是傳統文件分割後的小塊。每個組塊的數據必須保證能在內存中處理,即小於內存大小,因爲內存中還要存儲其它必要信息如:

  1. 廢棄集(Discard Set)
  2. 壓縮集(Compression Set)
  3. 保留集(Retained Set)
    這裏寫圖片描述
    這裏寫圖片描述

既然廢棄集或壓縮集中的點不再存儲,那麼這個廢棄集是如何表示這些點的信息的呢?
N-SUM-SUMSQ表示:

  • 所表示的點的數目N
  • 向量SUM:所有點在每一維的分量之和,即SUM[i]表示第i維上的分量和。
  • 向量SUMSQ:所有點在每一維的分量的平方和。

因此,如果數據爲d維的話,通過此方法可以用2d+1個值來表示一個廢棄集或壓縮集。而哦我們的實際目標是將一系列點表示爲它們的數目、質心和每一維的標準差。根據N-SUM-SUMSQ表示,我們可以得到:

  1. 第i維質心:SUMiN
  2. 第i維的方差:SUMSQiNSUMi2N2
    該方差的算術平方根就是標準差
    這裏寫圖片描述

數據處理過程
1. 首先找到所有“sufficiently close”充分接近某個簇質心的點加入到該簇中。加入新的點後,DS廢棄集的調整計算通過N-SUM-SUMSQ表示很容易實現,直接加上這些新加入的點的Ns,SUMs,SUMSQs 值即可。
2. 剩下得即是那些並不充分接近任一個簇質心的點。我們將這些點和之前的留存集中的點一起進行聚類(use any main-memory clustering algorithm)。將聚類的點概括表示並加入到壓縮集CS中,剩餘的單點簇則表示爲點的留存集RS。
3. 通過第二步後,現在我們有了新的迷你簇,它們和上一個塊的數據處理後留下的壓縮集迷你簇和留存集中間可能距離很近是可以合併的。因此這一步就是將這些迷你簇和以前的壓縮集的迷你簇和以前的留存集進行合併。
(如果這是最後一塊數據了,那麼就將這些留存集的點和壓縮集分配到距離最近的簇中,否則繼續保留壓縮集和留存集,等待和下一塊的數據一起處理。)
4. 分配給一個簇或迷你簇的點,即不再留存集中的點會和分配結果一起寫出到二級存儲器中。

雖然總體流程已經清楚了,但是我們不免對中間的實現細節有很多疑問:
如何確定某個新的點p距離某個簇足夠近呢?如何界定這個”close enough“?
怎樣界定兩個壓縮集是可以被合併的呢?
Q1:How Close is Close Enough?
BFR approach:計算新的點p和每個簇質心的馬氏距離(Mahalanobis Distance),我們選擇具有最短馬氏距離,且馬氏距離小於某個閾值的簇加入。
馬氏距離可以表示該點到該簇質心的概率。這一計算利用了最開始提到的BFR算法的前提假設:每個簇都是正態分佈的點構成,且點的座標和空間座標保持一致。
這裏寫圖片描述
這裏寫圖片描述

Q2:Should 2 CS clusters be combined?
一種方式是計算兩個cs clusters合併後的新的壓縮集簇的方差,如果這個方差小於某個閾值則可以合併。
當然我們也可以選擇其他方式,比如考慮新簇的密度等度量方式。

CURE算法

本節討論另一個點分配類的大規模聚類算法CURE算法(Clustering Using Representatives),仍然假定運行在歐式空間下。BFR算法對簇的分佈和形狀都有很強的假設條件,因此在實際使用中有許多並不滿足條件的聚類情況。而本節討論的CURE算法不需要簇滿足正態分佈,更不需要符合軸平行,即對簇的形狀沒有任何假設。CURE算法使用一些代表點的集合來表示簇而不再是質心。

CURE算法初始化

這裏寫圖片描述
(向質心移動一定距離)

CURE算法的完成

通過前面對每個簇生成代表點後,重新計算其它所有點到這些代表點的距離,將距離最近的分配到該簇中。(對數據的一次遍歷就夠了)

Ref:
https://class.coursera.org/mmds-003/lecture
《大數據:互聯網大規模數據挖掘與分佈式處理》

From:http://blog.csdn.net/sherrylml/article/details/49363509

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章