dbscan是一種著名的基於密度的聚類演算法,是martin ester、hans-peter kriegel等人在2023年提出來的(參考文獻:a density-based algorithm for discovering clusters in large spatial database)。該演算法能夠有效處理雜訊點和發現任意形狀的空間聚類,與k-means聚類演算法相比,不需要輸入要劃分的聚類個數。
定義1:(e-領域) :點p的e-鄰域記作:
即:以p為圓心,e為半徑的範圍裡,所有的點q的集合。
定義2:(直接密度可達):如果:
(1)點p在點q的e-領域內
(2)在點q的e-領域內,至少包含minpts個點
那麼點p由點q直接密度可達,滿足第2個條件的點q,被稱為核心點(core point)。
定義3:(邊界點):邊界點(border point)不是核心點,因為它不滿足其e-鄰域內,至少包含minpts個點,但邊界點在其他核心點的e-鄰域內。
定義4:(密度可達):如果有一連串的點p1,…,pn,p1=q,pn=p並且pi+1由pi直接密度可達,則稱點p由點q密度可達。
定義5:(密度相連):如果有乙個點o,點p和點q都由點o密度可達,那麼稱點p和點q密度相連。
定義6:(簇):乙個簇(cluster)是乙個非空集合,並且滿足以下條件:
(1)對於所有的點p和點q,如果點p在簇內,並且點q由點p密度可達,那麼點q也在簇內
(2)對於所有在簇內的點p和點q,點p和點q密度相連
定義7:(雜訊):雜訊(noise)是不包含於任何乙個簇內的點。
引理:如果點p是乙個核心點,那麼由點p密度可達的所有點組成的集合就是乙個簇。
綜上所述:dbscan將資料點劃分為三類:核心點、邊界點、雜訊;點與點之間的狀態有3種:直接密度可達,密度可達,密度相連;dbscan有兩個引數:e和minpts。所以引數不同,得到的結果就不同,因此要不斷地調參進行試驗以找到理想的結果。
說明:(1)clusterid:=nextid(noise),這句話的意思是首先從資料集中任選乙個核心點為「種子」再由此出發確定相應的聚簇類,如果選到了乙個雜訊或邊界點,肯定是無法擴充套件了,因此就需要重新再選乙個點。這其實是乙個初始化過程,初始化了clusrerid。
(2)expandcluster是最重要的乙個函式,如果它返回false,則說明這個點point是乙個雜訊或者是乙個邊界點;如果它返回true,則說明乙個簇形成了,要進行下乙個簇的聚類。
(3)一定要注意,在**的偽**中,把雜訊和邊界點都標記為了noise。
說明:(1)首先計算傳進來的point的e-鄰域,並把每個範圍內的點加入到佇列。如果不是核心點就返回false,如果是核心點,就進行擴充套件,目的就是找出所有由point密度可達的點。
(2)被標記為noise的點在稍後可能會改變,因為它可能是乙個邊界點。但是**裡並沒有對這類點進行處理,因為邊界點不會改變結果。
除了可以自己寫**實現dbscan,也可以利用第三方類庫進行簡單呼叫。
首先需要安裝第三方類庫sklearn、numpy,之後匯入相應的模組進行初始化建立物件
from sklearn.cluster import dbscan
import numpy as np
dbscan(eps=3, min_samples=2)
接下來就是對資料集的聚類:
x = np.array([[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]])
clustering = dbscan(eps=3, min_samples=2).fit(x)
最後就是輸出聚類結果(每個資料點的標籤,標籤值為-1的是雜訊):
labels = clustering.labels_
也可以使用乙個函式完成上述兩個功能:
fit_predict(x)
輸出類簇的個數:
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
利用matplotlib進行資料視覺化:
import matplotlib.pyplot as plt
labels = dbscan(eps=3, min_samples=2).fit_predict(x)
plt.scatter(x[:, 0], x[:, 1], c=labels)
plt.show()
聚類演算法 DBSCAN
dbscan 是一種簡單的,基於密度的聚類演算法。本次實現中,dbscan 使用了基於中心的方法。在基於中心的方法中,每個資料點的密度通過對以該點為中心以邊長為 2 eps 的網格 鄰域 內的其他資料點的個數來度量。根據資料點的密度分為三類點 1 核心點 該點在鄰域內的密度超過給定的閥值 minps...
DBSCAN聚類演算法
基於密度定義,我們將點分為 dbscan演算法的本質就是隨大流,邊界點緊緊圍繞著核心點,他們抱團,不帶噪點玩兒 小團體多了,聯絡比較密切的小團體之間聚成了同個類 比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的乙個類 一開始就被孤立的噪點吧,自然有自己的傲骨,接著孤芳...
DBSCAN 聚類演算法
dbscan演算法是一種基於密度聚類的演算法。核心概念 核心點 若某個點的密度達到演算法設定的閾值 即 r 鄰域內點的數量不小於 minpts 則其為核心點。直接密度可達 若某點p在點q的 r 鄰域內,且q是核心點,則稱p從q出發直接密度可達。密度可達 若有乙個點的序列q0 q1 qk,對任意qi從...