1、演算法的流程
重複以上過程
偽**:
(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 for
2、優點
3、缺點1、空間變換
所謂的空間變換,就是我們用互達距離來表示兩個樣本點之間的距離。這樣會使得,**密集區域的樣本距離不受影響,而稀疏區域的樣本點與其他樣本點的距離被放大。這增加了聚類演算法對散點的魯棒性。**空間變換的效果顯然取決於k的選擇,當k較大時,會使得核心距離變大,所以互達距離也變大,這樣會有更多樣本點被分配到稀疏區域。即更多點將被視為散點。
2、建立最小生成樹
我們可將資料看作乙個加權圖,其中資料點為頂點,任意兩點之間的邊的權重為這些點之間的互達距離。對影象進行**。最終圖的變化過程是:從完全圖到極小連通子圖。hdbscan使用最小生成樹演算法:
3、層次聚類結構
這樣就構建出了聚合樹:
可以理解,類似於哈夫曼樹的構造,這棵樹自上而下資料之間的距離是從大到小的。
4、剪枝
同時進行剪枝,即最小子樹做了限制,主要是為了控制生成的類簇不要過小:
5、提取簇
經過聚類樹的壓縮操作,樹中已經沒有了散點,我現在的任務只是將比較相近的節點合併到一族中去,我們最後選擇的簇能夠有更好的穩定性。
我們可以這裡理解,有乙個閾值distance,如上圖的紅線。用它切割,面最近的節點作為聚類的乙個類,而紅線上面的聚起來的都是散點。問題是,我們如何知道閾值在**?能不能有更好的提取族的方式呢?hdbscan定義了一種基於穩定度的提取族方式那麼如何來定義樹中節點的穩定度呢?
我們先定義乙個λ,它是距離的倒數:
對於樹中的某個節點定義兩個量:λbirth,λdeath
λbirth表示:**產生當前節點時,distance的倒數。
λdeath表示:當前節點被**成兩個子結點時,distance的倒數。
λp表示:當前節點(族)下各節點p從前節點(族)分離出去時,distance的倒數。
在這裡對λp做下說明,p從聚類族分離出去有兩種情況:
我們定義穩定度為:
提取簇步驟:
將壓縮聚類樹的每個葉節點都選定為某個簇。
如果當前節點的穩定性小於兩個子結點的穩定性總和,那麼我們將該節點的穩定性設定為其子節點的穩定性之和。如果當前節點的穩定性大於兩個子結點的穩定性總和,那麼將當前節點定為某個簇。
聚類總結(中) 密度聚類
密度聚類是一種基於密度的聚類方法,基於密度的聚類方法的主要思想是尋找被低密度區域分離的高密度區域。密度度量 乙個點的區域性密度有不同的度量方式 1.畫個圈,數圈內其他點個數是一種方法。2.用圈內其他點和給點半徑的比值的高斯概率密度形式,對距離核心點距離近的給大權重。3.計算圈內距離最小的前n個點到核...
DBSCAN 密度聚類
dbscan 密度聚類 dbscan演算法是一種基於密度的聚類演算法 聚類的時候不需要預先指定簇的個數 最終的簇的個數不定 dbscan演算法將資料點分為三類 核心點 在半徑eps內含有超過minpts數目的點 邊界點 在半徑eps內點的數量小於minpts,但是落在核心點的鄰域內 噪音點 既不是核...
python DBSCAN密度聚類
1.dbscan 演算法是一種基於密度的聚類演算法 2.dbscan 演算法將資料點分為三類 3.演算法流程 dbscan主要引數 eps 兩個樣本被看做鄰居節點的最大距離 min samles 簇的樣本數 metric 距離計算方式 import numpy as np from sklearn....