1. 程式人生 > >聚類-DBSCAN基於密度的空間聚類

聚類-DBSCAN基於密度的空間聚類

1.DBSCAN介紹

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種基於密度的空間聚類演算法。 該演算法將具有足夠密度的區域劃分為簇,並在具有噪聲的空間資料庫中發現任意形狀的簇,它將簇定義為密度相連的點的最大集合。

 

基於密度這點有什麼好處呢,我們知道kmeans聚類演算法只能處理球形的簇,也就是一個聚成實心的團(這是因為演算法本身計算平均距離的侷限)。但往往現實中還會有各種形狀,比如下面兩張圖,環形和不規則形,這個時候,那些傳統的聚類演算法顯然就悲劇了。於是就思考,樣本密度大的成一類唄。吶這就是DBSCAN聚類演算法

推薦一個很形象的描述DBSCAN的網站,視覺化

https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/

2.DBSCAN的重要引數

(1)eps 相當於圈的半徑,越大越小都不好,自己合適調節

(2)min_samples 相當於一個圈中最少的樣本數,不到的話,就被劃分為離散點

(3)metric 

 

 

 

3.DBSCAN案例

 1 import warnings
 2 warnings.filterwarnings('ignore')
 3 import numpy as np
 4 import matplotlib.pyplot as plt
 5 %matplotlib inline
 6 
 7 from sklearn import datasets
 8 from sklearn.cluster import DBSCAN,KMeans
 9 # noise控制疊加的噪聲的大小
10 X,y = datasets.make_circles(n_samples=1000,noise = 0.1,factor = 0.3)
11 
12 # centers=[[1.5,1.5]] 座標位置,在1.5,1.5生成
13 X3,y3 = datasets.make_blobs(n_samples=500,n_features=2,centers=[[1.5,1.5]],cluster_std=0.2)
14 
15 # 將兩個資料級聯
16 X = np.concatenate([X,X3])
17 
18 y = np.concatenate([y,y3+2])
19 
20 plt.scatter(X[:,0],X[:,1],c = y)

生成的資料:

 

 

1 # kmeans 
2 # 有缺陷
3 kmeans = KMeans(3)
4 kmeans.fit(X)
5 y_ = kmeans.predict(X)
6 plt.scatter(X[:,0],X[:,1],c = y_)

kmeans形成的:可以看出,效果很不好

 

 

1 # dbcan
2 dbscan = DBSCAN(eps = 0.15,min_samples=5)
3 dbscan.fit(X)
4 # y_ = dbscan.fit_predict(X)
5 y_ = dbscan.labels_
6 plt.scatter(X[:,0],X[:,1],c = y_)

 

 可以看出來,使用dbscan效果明顯不錯

之後,可以再使用之前kmeans中的評測指標才評測一下

4.總結一下DBSCAN流程:

  • DBSCAN 從一個沒有被訪問過的任意起始資料點開始。這個點的鄰域是用距離 ε(ε 距離內的所有點都是鄰域點)提取的。

  • 如果在這個鄰域內有足夠數量的點(根據 minPoints),則聚類過程開始,並且當前資料點成為新簇的第一個點。否則,該點將會被標記為噪聲(稍後這個噪聲點可能仍會成為聚類的一部分)。在這兩種情況下,該點都被標記為「已訪問」。

  • 對於新簇中的第一個點,其 ε 距離鄰域內的點也成為該簇的一部分。這個使所有 ε 鄰域內的點都屬於同一個簇的過程將對所有剛剛新增到簇中的新點進行重複。

  • 重複步驟 2 和 3,直到簇中所有的點都被確定,即簇的 ε 鄰域內的所有點都被訪問和標記過。

  • 一旦我們完成了當前的簇,一個新的未訪問點將被檢索和處理,導致發現另一個簇或噪聲。重複這個過程直到所有的點被標記為已訪問。由於所有點都已經被訪問,所以每個點都屬於某個簇或噪聲。

5.DBSCAN的優缺點

優點:

DBSCAN 與其他聚類演算法相比有很多優點。首先,它根本不需要固定數量的簇。它也會將異常值識別為噪聲,而不像均值漂移,即使資料點非常不同,也會簡單地將它們分入簇中。另外,它能夠很好地找到任意大小和任意形狀的簇。

缺點:

DBSCAN 的主要缺點是當簇的密度不同時,它的表現不如其他聚類演算法。這是因為當密度變化時,用於識別鄰域點的距離閾值 ε 和 minPoints 的設定將會隨著簇而變化。這個缺點也會在非常高維度的資料中出現,因為距離閾值 ε 再次變得難以估計。

 

 

 

&n