dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)
# 密度聚類DBSCAN、HDBSCAN
DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基于密度的聚類方法)是一種基于密度的空間聚類算法。該算法將具有足夠密度的區域劃分為簇,并在具有噪聲的空間數據庫中發現任意形狀的簇,它將簇定義為密度相連的點的最大集合。 在DBSCAN算法中將數據點分為三類:
- 核心點(Core point)。若樣本 的 鄰域內至少包含了MinPts個樣本,即 ( )≥ ,則稱樣本點 為核心點。
- 邊界點(Border point)。若樣本 的 鄰域內包含的樣本數目小于MinPts,但是它在其他核心點的鄰域內,則稱樣本點 為邊界點。
- 噪音點(Noise)。既不是核心點也不是邊界點的點
1、算法的流程
- 根據給定的鄰域參數Eps和MinPts確定所有的核心對象
- 對每一個核心對象
- 選擇一個未處理過的核心對象,找到由其密度可達的的樣本生成聚類“簇”
- 重復以上過程
偽代碼:
(1) 首先將數據集D中的所有對象標記為未處理狀態 (2) for(數據集D中每個對象p) do (3) if (p已經歸入某個簇或標記為噪聲) then (4) continue; (5) else (6) 檢查對象p的Eps鄰域 NEps(p) ; (7) if (NEps(p)包含的對象數小于MinPts) then (8) 標記對象p為邊界點或噪聲點; (9) else (10) 標記對象p為核心點,并建立新簇C, 并將p鄰域內所有點加入C (11) for (NEps(p)中所有尚未被處理的對象q) do (12) 檢查其Eps鄰域NEps(q),若NEps(q)包含至少MinPts個對象,則將NEps(q)中未歸入任何一個簇的對象加入C; (13) end for (14) end if (15) end if (16) end for2、優點
- 相比K-Means,DBSCAN 不需要預先聲明聚類數量。
- 可以對任意形狀的稠密數據集進行聚類,相對的,K-Means之類的聚類算法一般只適用于凸數據集。
- 可以在聚類的同時發現異常點,對數據集中的異常點不敏感。
- 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。
3、缺點
- 當空間聚類的密度不均勻、聚類間距差相差很大時,聚類質量較差,因為這種情況下參數MinPts和Eps選取困難。
- 如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。
- 在兩個聚類交界邊緣的點會視乎它在數據庫的次序決定加入哪個聚類,幸運地,這種情況并不常見,而且對整體的聚類結果影響不大(DBSCAN*變種算法,把交界點視為噪音,達到完全決定性的結果。)
- 調參相對于傳統的K-Means之類的聚類算法稍復雜,主要需要對距離閾值eps,鄰域樣本數閾值MinPts聯合調參,不同的參數組合對最后的聚類效果有較大影響。
HDBSCAN聚類
1、空間變換
所謂的空間變換,就是我們用互達距離來表示兩個樣本點之間的距離。這樣會使得,密集區域的樣本距離不受影響,而稀疏區域的樣本點與其他樣本點的距離被放大。這增加了聚類算法對散點的魯棒性。空間變換的效果顯然取決于K的選擇,當K較大時,會使得核心距離變大,所以互達距離也變大,這樣會有更多樣本點被分配到稀疏區域。即更多點將被視為散點。
2、建立最小生成樹
我們可將數據看作一個加權圖,其中數據點為頂點,任意兩點之間的邊的權重為這些點之間的互達距離。對圖像進行分裂。最終圖的變化過程是:從完全圖到極小連通子圖。HDBSCAN使用最小生成樹算法:
3、層次聚類結構
- 第一步:將樹中的所有邊按照距離遞增排序
- 第二步:然后依次選取每條邊,將邊的鏈接的兩個子圖進行合并。
這樣就構建出了聚合樹:
可以理解,類似于哈夫曼樹的構造,這棵樹自上而下數據之間的距離是從大到小的。
4、剪枝
同時進行剪枝,即最小子樹做了限制,主要是為了控制生成的類簇不要過小:
- 第一步:確定最小族大小n
- 第二步:自上而下遍歷聚類樹,并在每個節點分裂時:看分裂產生的兩個樣本子集的樣本數是否大于n
- 如果左右兒子中有一個子結點的樣本數< n,我們就直間將該節點刪除,并且另一個子節點保留父節點的身份
- 如果兩個子結點中的樣本數都<n,那么就將其兩個子節點都刪除,即當前節點不再向下分裂
- 如果兩個子結點中的樣本數都>=n,那么我們進行正常分裂,即保持原聚類樹不變。
5、提取簇
經過聚類樹的壓縮操作,樹中已經沒有了散點,我現在的任務只是將比較相近的節點合并到一族中去,我們最后選擇的簇能夠有更好的穩定性。
我們可以這里理解,有一個閾值distance,如上圖的紅線。用它切割,面最近的節點作為聚類的一個類,而紅線上面的聚起來的都是散點。問題是,我們如何知道閾值在哪里?能不能有更好的提取族的方式呢?HDBSCAN定義了一種基于穩定度的提取族方式那么如何來定義樹中節點的穩定度呢? 我們先定義一個λ,它是距離的倒數:
對于樹中的某個節點定義兩個量:λbirth,λdeath λbirth表示:分裂產生當前節點時,distance的倒數。 λdeath表示:當前節點被分裂成兩個子結點時,distance的倒數。 λp表示:當前節點(族)下各節點p從前節點(族)分離出去時,distance的倒數。 在這里對λp做下說明,p從聚類族分離出去有兩種情況:
- λp = λdeath時,即該節點(簇)被分裂成兩個子結點了
- λbirth <= λp < λdeath時,即在該之間距離變化中可能切割出散點。此時,原來的節點(簇)并沒有分裂成兩個子結點,而是直接把散點給移除了。
我們定義穩定度為:
提取簇步驟:
- 第一步:初始化族
將壓縮聚類樹的每個葉節點都選定為某個簇。
- 第二步:自下而上遍歷遍歷整棵樹,并且每一步進行下面操作:
如果當前節點的穩定性小于兩個子結點的穩定性總和,那么我們將該節點的穩定性設置為其子節點的穩定性之和。如果當前節點的穩定性大于兩個子結點的穩定性總和,那么將當前節點定為某個簇。
總結
以上是生活随笔為你收集整理的dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .git文件夹_Git幸存者指南
- 下一篇: matlab粒子图像测速工具,程序 PI