DBSCAN聚類演算法

2021-09-28 22:27:47 字數 2181 閱讀 3758

是一種密度聚類演算法,它基於一組"鄰域" (neighborhood) 引數來刻畫樣本分佈的緊密程度.。可在雜訊的空間資料庫中發現任意形狀的聚類。

給定資料集d=" class="mathcode" src=""/>,

如下圖: 

故dbscan

"簇"定義為:由密度可達關係匯出的最大的 密度相連樣本集合。

那麼如何找這個「簇」呢?

====》即是由 x 

密度可達的所有樣本組成的集合。

dbscan

演算法先任選資料集中的乙個核心物件為"種子"(seed)

再由此出發確定相應的聚類簇。如下描述:

(1)repeat

(2)從資料庫中抽出乙個未處理的點;

(3)if抽出的點是核心點 then 找出所有從該點密度可達的物件,形成乙個簇;

(4)else 抽出的點是邊緣點(非核心物件),跳出本次迴圈,尋找下乙個點;

(5)until 所有的點都被處理。

詳細過程如下: 

聚類生成過程如下圖: 

缺點:

dbscan對使用者定義的引數很敏感,細微的不同都可能導致差別很大的結果,而引數(如鄰域半徑,核心物件鄰域內最小樣本數等)的選擇無規律可循,只能靠經驗確定。

優點:

對於非凸資料集的聚類表現好

from sklearn.cluster import dbscan

import numpy as np

import matplotlib.pyplot as plt

from sklearn import datasets

#準備資料

x1, y1=datasets.make_circles(n_samples=5000, factor=.6, noise=.05)

x2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]], random_state=9)

x = np.concatenate((x1, x2))

#開始聚類

y_pred = dbscan(eps = 0.1, min_samples = 10).fit_predict(x)

plt.scatter(x[:, 0], x[:, 1], c=y_pred)

plt.show()

dbscan函式:eps是鄰域半徑,min_samples是該鄰域內應有的最小樣本數。其餘引數時預設值就好。

但是如果鄰域半徑和核心物件鄰域內最小樣本數等引數選取不好的話,則聚類效果會不一樣,比如出現下面這種情況:

對於非凸資料集的聚類表現好,同樣的資料如果採用k-means的話則是:

對比了dbscan和k-mean演算法在處理特殊分布資料上的差異)

聚類演算法 DBSCAN

dbscan 是一種簡單的,基於密度的聚類演算法。本次實現中,dbscan 使用了基於中心的方法。在基於中心的方法中,每個資料點的密度通過對以該點為中心以邊長為 2 eps 的網格 鄰域 內的其他資料點的個數來度量。根據資料點的密度分為三類點 1 核心點 該點在鄰域內的密度超過給定的閥值 minps...

DBSCAN聚類演算法

基於密度定義,我們將點分為 dbscan演算法的本質就是隨大流,邊界點緊緊圍繞著核心點,他們抱團,不帶噪點玩兒 小團體多了,聯絡比較密切的小團體之間聚成了同個類 比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的乙個類 一開始就被孤立的噪點吧,自然有自己的傲骨,接著孤芳...

DBSCAN 聚類演算法

dbscan演算法是一種基於密度聚類的演算法。核心概念 核心點 若某個點的密度達到演算法設定的閾值 即 r 鄰域內點的數量不小於 minpts 則其為核心點。直接密度可達 若某點p在點q的 r 鄰域內,且q是核心點,則稱p從q出發直接密度可達。密度可達 若有乙個點的序列q0 q1 qk,對任意qi從...