1. 程式人生 > >系統學習機器學習之半引數方法(二)--基於密度

系統學習機器學習之半引數方法(二)--基於密度

轉自:https://www.cnblogs.com/pinard/p/6208966.html

基於密度聚類

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種很典型的密度聚類演算法,和K-Means,BIRCH這些一般只適用於凸樣本集的聚類相比,DBSCAN既可以適用於凸樣本集,也可以適用於非凸樣本集。下面我們就對DBSCAN演算法的原理做一個總結。

1. 密度聚類原理

    DBSCAN是一種基於密度的聚類演算法,這類密度聚類演算法一般假定類別可以通過樣本分佈的緊密程度決定。同一類別的樣本,他們之間的緊密相連的,也就是說,在該類別任意樣本週圍不遠處一定有同類別的樣本存在。

    通過將緊密相連的樣本劃為一類,這樣就得到了一個聚類類別。通過將所有各組緊密相連的樣本劃為各個不同的類別,則我們就得到了最終的所有聚類類別結果。

2. DBSCAN密度定義

    在上一節我們定性描述了密度聚類的基本思想,本節我們就看看DBSCAN是如何描述密度聚類的。DBSCAN是基於一組鄰域來描述樣本集的緊密程度的,引數(ϵ, MinPts)用來描述鄰域的樣本分佈緊密程度。其中,ϵ描述了某一樣本的鄰域距離閾值,MinPts描述了某一樣本的距離為ϵ的鄰域中樣本個數的閾值。

    假設我的樣本集是D=(x1,x2,...,xm),則DBSCAN具體的密度描述定義如下:

    1) ϵ-鄰域:對於xj∈D,其ϵ-鄰域包含樣本集D中與xj的距離不大於ϵ的子樣本集,即Nϵ(xj)={xi∈D|distance(xi,xj)≤ϵ}, 這個子樣本集的個數記為|Nϵ(xj)|

    2) 核心物件:對於任一樣本xj∈D,如果其ϵ-鄰域對應的Nϵ(xj)至少包含MinPts個樣本,即如果|Nϵ(xj)|≥MinPts,則xj是核心物件。 

    3)密度直達:如果xi位於xj的ϵ-鄰域中,且xj是核心物件,則稱xi由xj密度直達。注意反之不一定成立,即此時不能說xj由xi密度直達, 除非且xi也是核心物件。

    4)密度可達:對於xi和xj,如果存在樣本樣本序列p1,p2,...,pT,滿足p1=xi,pT=xj, 且pt+1由pt密度直達,則稱xj由xi密度可達。也就是說,密度可達滿足傳遞性。此時序列中的傳遞樣本p1,p2,...,pT−1均為核心物件,因為只有核心物件才能使其他樣本密度直達。注意密度可達也不滿足對稱性,這個可以由密度直達的不對稱性得出。

    5)密度相連:對於xi和xj,如果存在核心物件樣本xk,使xi和xj均由xk密度可達,則稱xi和xj密度相連。注意密度相連關係是滿足對稱性的。

    從下圖可以很容易看出理解上述定義,圖中MinPts=5,紅色的點都是核心物件,因為其ϵ-鄰域至少有5個樣本。黑色的樣本是非核心物件。所有核心物件密度直達的樣本在以紅色核心物件為中心的超球體內,如果不在超球體內,則不能密度直達。圖中用綠色箭頭連起來的核心物件組成了密度可達的樣本序列。在這些密度可達的樣本序列的ϵ-鄰域內所有的樣本相互都是密度相連的。

 

    有了上述定義,DBSCAN的聚類定義就簡單了。

3. DBSCAN密度聚類思想

    DBSCAN的聚類定義很簡單:由密度可達關係匯出的最大密度相連的樣本集合,即為我們最終聚類的一個類別,或者說一個簇。

    這個DBSCAN的簇裡面可以有一個或者多個核心物件。如果只有一個核心物件,則簇裡其他的非核心物件樣本都在這個核心物件的ϵ-鄰域裡;如果有多個核心物件,則簇裡的任意一個核心物件的ϵ-鄰域中一定有一個其他的核心物件,否則這兩個核心物件無法密度可達。這些核心物件的ϵ-鄰域裡所有的樣本的集合組成的一個DBSCAN聚類簇。

    那麼怎麼才能找到這樣的簇樣本集合呢?DBSCAN使用的方法很簡單,它任意選擇一個沒有類別的核心物件作為種子,然後找到所有這個核心物件能夠密度可達的樣本集合,即為一個聚類簇。接著繼續選擇另一個沒有類別的核心物件去尋找密度可達的樣本集合,這樣就得到另一個聚類簇。一直執行到所有核心物件都有類別為止。

    基本上這就是DBSCAN演算法的主要內容了,是不是很簡單?但是我們還是有三個問題沒有考慮。

    第一個是一些異常樣本點或者說少量遊離於簇外的樣本點,這些點不在任何一個核心物件在周圍,在DBSCAN中,我們一般將這些樣本點標記為噪音點。

    第二個是距離的度量問題,即如何計算某樣本和核心物件樣本的距離。在DBSCAN中,一般採用最近鄰思想,採用某一種距離度量來衡量樣本距離,比如歐式距離。這和KNN分類演算法的最近鄰思想完全相同。對應少量的樣本,尋找最近鄰可以直接去計算所有樣本的距離,如果樣本量較大,則一般採用KD樹或者球樹來快速的搜尋最近鄰。如果大家對於最近鄰的思想,距離度量,KD樹和球樹不熟悉,建議參考之前寫的另一篇文章K近鄰法(KNN)原理小結

    第三種問題比較特殊,某些樣本可能到兩個核心物件的距離都小於ϵ,但是這兩個核心物件由於不是密度直達,又不屬於同一個聚類簇,那麼如果界定這個樣本的類別呢?一般來說,此時DBSCAN採用先來後到,先進行聚類的類別簇會標記這個樣本為它的類別。也就是說BDSCAN的演算法不是完全穩定的演算法。

4. DBSCAN聚類演算法

    下面我們對DBSCAN聚類演算法的流程做一個總結。

    輸入:樣本集D=(x1,x2,...,xm),鄰域引數(ϵ,MinPts), 樣本距離度量方式

    輸出: 簇劃分C. 

    1)初始化核心物件集合Ω=∅, 初始化聚類簇數k=0,初始化未訪問樣本集合Γ = D,  簇劃分C = ∅

    2) 對於j=1,2,...m, 按下面的步驟找出所有的核心物件:

      a) 通過距離度量方式,找到樣本xj的ϵ-鄰域子樣本集Nϵ(xj)

      b) 如果子樣本集樣本個數滿足|Nϵ(xj)|≥MinPts, 將樣本xj加入核心物件樣本集合:Ω=Ω∪{xj}

    3)如果核心物件集合Ω=∅,則演算法結束,否則轉入步驟4.

    4)在核心物件集合Ω中,隨機選擇一個核心物件o,初始化當前簇核心物件佇列Ωcur={o}, 初始化類別序號k=k+1,初始化當前簇樣本集合Ck={o}, 更新未訪問樣本集合Γ=Γ−{o}

    5)如果當前簇核心物件佇列Ωcur=∅,則當前聚類簇Ck生成完畢, 更新簇劃分C={C1,C2,...,Ck}, 更新核心物件集合Ω=Ω−Ck, 轉入步驟3。

    6)在當前簇核心物件佇列Ωcur中取出一個核心物件o′,通過鄰域距離閾值ϵ找出所有的ϵ-鄰域子樣本集Nϵ(o′),令Δ=Nϵ(o′)∩Γ, 更新當前簇樣本集合Ck=Ck∪Δ, 更新未訪問樣本集合Γ=Γ−Δ,  更新Ωcur=Ωcur∪(Δ∩Ω)−o′,轉入步驟5.

    輸出結果為: 簇劃分C={C1,C2,...,Ck}

5. DBSCAN小結

    和傳統的K-Means演算法相比,DBSCAN最大的不同就是不需要輸入類別數k,當然它最大的優勢是可以發現任意形狀的聚類簇,而不是像K-Means,一般僅僅使用於凸的樣本集聚類。同時它在聚類的同時還可以找出異常點,這點和BIRCH演算法類似。

    那麼我們什麼時候需要用DBSCAN來聚類呢?一般來說,如果資料集是稠密的,並且資料集不是凸的,那麼用DBSCAN會比K-Means聚類效果好很多。如果資料集不是稠密的,則不推薦用DBSCAN來聚類。

    下面對DBSCAN演算法的優缺點做一個總結。

    DBSCAN的主要優點有:

    1) 可以對任意形狀的稠密資料集進行聚類,相對的,K-Means之類的聚類演算法一般只適用於凸資料集。

    2) 可以在聚類的同時發現異常點,對資料集中的異常點不敏感。

    3) 聚類結果沒有偏倚,相對的,K-Means之類的聚類演算法初始值對聚類結果有很大影響。

    DBSCAN的主要缺點有:

    1)如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類一般不適合。

    2) 如果樣本集較大時,聚類收斂時間較長,此時可以對搜尋最近鄰時建立的KD樹或者球樹進行規模限制來改進。

    3) 調參相對於傳統的K-Means之類的聚類演算法稍複雜,主要需要對距離閾值ϵ,鄰域樣本數閾值MinPts聯合調參,不同的引數組合對最後的聚類效果有較大影響。

使用網格

基於距離的聚類演算法只能發現球狀簇、處理大資料集以及高維資料集時,不夠有效。另一方面發現的聚類個數往往依賴於使用者引數的指定。這對使用者來說是非常困難的。基於網格的聚類演算法將空間量化為有限數目的單元,形成一個網格結構,所有聚類都在網格上進行。

  基於網格的聚類方法採用空間驅動的方法,把嵌入空間劃分成獨立於輸入物件分佈的單元。基於網格的聚類方法使用一種多解析度的網路資料結構。它將物件空間量化成有限數目的單元,這些網格形成了網格結構,所有的聚類結構都在該結構上進行。這種方法的主要優點是處理速度快,其處理時間獨立於資料物件數,而僅依賴於量化空間中的每一維的單元數。

  總結一下就是:將物件空間量化為有限數目的單元,形成一個網狀結構,所有聚類都在這個網狀結構上進行。

  基本思想就是將每個屬性的可能值分割成許多相鄰的區間,建立網格單元的集合(我們假設屬性值是連續的,序數的,區間的)。每個物件落入一個網格單元,網格單元對應的屬性空間包含該物件的值。

1.STING:統計資訊網格

  STING是一種基於網格的多解析度的聚類技術,它將輸入物件的空間區域劃分成矩形單元,空間可以用分層和遞迴方法進行劃分。這種多層矩形單元對應不同的解析度,並且形成了一個層次結構:每個高層單元被劃分成低一層的單元。關於每個網格單元的屬性的統計資訊(如均值,最大值和最小值)被作為統計引數預先計算和儲存。對於查詢處理和其他資料分析任務,這些統計引數是有效的。

  STING演算法:

  (1)      針對不同的解析度,通常有多個級別的矩形單元。

  (2)      這些單元形成了一個層次結構,高層的每個單元被劃分成多個底一層的單元。

  (3)      關於每個網格單元屬性的統計資訊(例如平均值,max,min)被預先計算和儲存,這些統計資訊用於回答查詢。(統計資訊是進行查詢使用的)

  網格中常用的引數:

  (1)      count 網格中物件數目

  (2)      mean網格中所有值的平均值

  (3)      stdev網格中屬性值的標準偏差

  (4)      min 網格中屬性值的最小值

  (5)      max 網格中屬性值的最大值

  (6)      distribution 網格中屬性值符合的分佈型別。如正態分佈,均勻分佈

  STING聚類的層次結構:

  通過上面兩幅圖,我們可以清晰的理解,STING的層次結構,上一層與下一層的關係。

  注意:當資料載入到資料庫時。最底層的單元引數直接由資料計算,若分佈型別知道,可以使用者直接指定。而較高層的單元的分佈型別可以基於它對應的低層單元多數的分佈型別,用一個閾值過濾過程的合取來計算,若底層分佈型別彼此不同,那麼高層分佈型別為none

  STING查詢演算法步驟:

  (1) 從一個層次開始

  (2) 對於這一個層次的每個單元格,我們計算查詢相關的屬性值。

  (3) 從計算的屬性值以及約束條件下,我們將每一個單元格標記成相關或者不想關。(不相關的單元格不再考慮,下一個較低層的處理就只檢查剩餘的相關單元)

  (4) 如果這一層是底層,那麼轉(6),否則轉(5)

  (5) 我們由層次結構轉到下一層,依照步驟2進行

  (6) 查詢結果得到滿足,轉到步驟8,否則(7)

  (7) 恢復資料到相關的單元格進一步處理以得到滿意的結果,轉到步驟(8)

  (8) 停止

  到這兒,STING演算法應該基本就差不多了,其核心思想就是:根據屬性的相關統計資訊進行劃分網格,而且網格是分層次的,下一層是上一層的繼續劃分。在一個網格內的資料點即為一個簇。

  同時,STING聚類演算法有一個性質:如果粒度趨向於0(即朝向非常底層的資料),則聚類結果趨向於DBSCAN聚類結果。即使用計數count和大小資訊,使用STING可以近似的識別稠密的簇。

  STING演算法的優點:

 (1)     基於網格的計算是獨立於查詢的,因為儲存在每個單元的統計資訊提供了單元中資料彙總資訊,不依賴於查詢。

 (2)     網格結構有利於增量更新和並行處理。

 (3)     效率高。STING掃描資料庫一次開計算單元的統計資訊,因此產生聚類的時間複雜度為O(n),在層次結構建立之後,查詢處理時間為)O(g),其中g為最底層網格單元的數目,通常遠遠小於n。

 缺點:

 (1) 由於STING採用了一種多解析度的方法來進行聚類分析,因此STING的聚類質量取決於網格結構的最底層的粒度。如果最底層的粒度很細,則處理的代價會顯著增加。然而如果粒度太粗,聚類質量難以得到保證。

 (2) STING在構建一個父親單元時沒有考慮到子女單元和其他相鄰單元之間的聯絡。所有的簇邊界不是水平的,就是豎直的,沒有斜的分界線。降低了聚類質量。

2.CLIQUE

        一種類似於Apriori的子空間聚類演算法

  CLIQUE演算法是基於網格的空間聚類演算法,但它同時也非常好的結合了基於密度的聚類演算法,因此既能夠發現任意形狀的簇,又可以像基於網格的演算法一樣處理較大的多維資料。

  CLIQUE演算法把每個維劃分成不重疊的社群,從而把資料物件的整個嵌入空間劃分成單元,它使用一個密度閾值來識別稠密單位,一個單元是稠密的,如果對映到它的物件超過密度閾值。

  總結之就是:CLIQUE演算法是一種基於網格的聚類演算法,用於發現子空間中基於密度的簇。

  演算法概述:

  演算法需要兩個引數:一個是網格的步長,第二個是密度的閾值。

  網格步長確定了空間的劃分,而密度閾值用來定義密集網格

   聚類思想:

  (1)     首先掃描所有網格。當發現第一個密集網格時,便以該網格開始擴充套件,擴充套件原則是若一個網格與已知密集區域內的網格鄰接並且其其自身也是密集的,則將該網格加入到該祕籍區域中,知道不再有這樣的網格被發現為止。(密集網格合併)

  (2)     演算法再繼續掃描網格並重覆上述過程,知道所有網格被遍歷。以自動地發現最高維的子空間,高密度聚類存在於這些子空間中,並且對元組的輸入順序不敏感,無需假設任何規範的資料分佈,它隨輸入資料的大小線性地擴充套件,當資料的維數增加時具有良好的可伸縮性。

  

  聚類演算法如上圖所示,總結之就是:首先判斷是不是密集網格,如果是密集網格。那麼對其相鄰的網格進行遍歷,看是否是密集網格,如果是的話,那麼屬於同一個簇。

   CLIQUE優點:

  (1)      給定每個屬性的劃分,單遍資料掃描就可以確定每個物件的網格單元和網格單元的計數。

  (2)      儘管潛在的網格單元數量可能很高,但是隻需要為非空單元建立網格。

  (3)      將每個物件指派到一個單元並計算每個單元的密度的時間複雜度和空間複雜度為O(m),整個聚類過程是非常高效的

   缺點:

  (1)      像大多數基於密度的聚類演算法一樣,基於網格的聚類非常依賴於密度閾值的選擇。(太高,簇可能丟失。太低,本應分開的簇可能被合併)

  (2)      如果存在不同密度的簇和噪聲,則也許不可能找到適合於資料空間所有部分的值。

  (3)      隨著維度的增加,網格單元個數迅速增加(指數增長)。即對於高維資料,基於網格的聚類傾向於效果很差。