完整版可關注公眾號:大資料技術宅獲取
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基於密度的有噪應用中的空間聚類)是一種簡單,卻又在處理時空資料時表現不錯的演算法,借最近正好有看,這裡整理下。不同於k-means,以中心點為原則進行聚類,只要樣本點離同一個簇中心最近,就被劃分到同一個簇中,且簇的形狀是“類圓形”(凸形狀)。DBSCAN將簇定義為密度相連的點的最大集合,即把樣本點的密度情況作為聚類的基本原則,然後把相互之間有聯絡且聚集程度高的那些部分連線起來最終形成簇。
DBSCAN原理
DBSCAN的原理可以概括為:同一個簇,其樣本兩兩相連;對於任意一個簇,對應的樣本集是最大最完整的,即在所有樣本點中,如果某個樣本點是由一個簇中的點出發可達的,那麼該點也將被劃分到同一個簇。
然而,如何定義上述的相連和可達呢,下面將給出DBSCAN的相關概念。
DBSCAN相關概念
ϵ-鄰域:以給定物件為中心,ϵ為半徑的區域。
核心物件(核心點):對於給定的點數MinPts,如果點p的ϵ鄰域包含至少MinPts個樣本點(包含p),那麼點p就被稱作核心物件。
密度直達:如果點p為核心物件,樣本點q出現在P的ϵ-鄰域中,那麼點q就是點p出發直接密度可達的(注意:不能說點p是由q出發密度直達的,除非q也是核心物件)。
密度可達:可達指從核心點出發可以到達的樣本點。這裡的到達分為2種情況:一種情況就是上面所說的密度直達的;另外一種,就是間接到達的。間接能到達就是說,可以找到一個物件鏈(序列),如p,p1,p2,...,pn,q(n>=1),其中後者從前者是密度直達的(p1由p直達,p1由p0直達,q由pn直達),那麼q就是由核心物件p出發可達的,q是一個可達點。
密度相連:對於兩個樣本點p和q,如果能找到一個樣本點o,使得o到p可達,同時o到q也可達,那麼p和q就是密度相連的。
簇:最大的密度相連物件的集合。
噪聲:不包含在任何簇中的物件。
為了讓大家更直觀的理解以上概念,給大家舉個小例子(見下圖,忽略字醜)。這裡假設MinPts=4,ϵ=1cm,那麼可以看出,對於左邊2個圖中標綠的點,顯然為核心物件,因為以它們為中心,ϵ為半徑畫圓後,圓裡邊的樣本點數均大於MinPts的值4。左圖s為q出發的密度直達點;左圖p為q出發密度可達點;中間那幅圖,由於o到p可達,o到q可達,故p和q密度相連。右圖由於最上邊的那個樣本點不在任何簇中,所以被歸為噪聲。
DBSCAN優缺點
(1)優點
無需指定簇個數
對任意形狀的稠密資料集都可以聚類,簇的形狀可以任意
擅長尋找離群點(檢測任務)
(2)缺點:
不適用於樣本集密度不均勻、聚類間距相差大的情況
樣本集較大時,聚類收斂時間較長
引數不好選擇(引數對聚類結果的影響較大)
DBSCAN聚類舉例
(1)生成資料集
程式碼:
1#匯入所需python模組
2from sklearn.datasets import make_blobs
3from sklearn.cluster import DBSCAN
4import matplotlib; matplotlib.use('TkAgg')
5import matplotlib.pyplot as plt
6import numpy as np
7#利用生成器生成具有三個簇的合成資料集,共1000個樣本點,為方便作圖,特徵維度這裡設為2
8X,t=make_blobs(n_samples=1000,n_features=2,centers=[[1.2,1.5],[2.2,1.1],[1.5,2.8]],cluster_std=[[0.3],[0.2],[0.25]],random_state=2020)
9#生成樣本點的分佈圖
10fig=plt.figure(figsize=(8,8))
11ax=fig.add_subplot(111)
12ax.scatter(X[:,0],X[:,1])
13plt.show()
生成的樣本點分佈圖: