【他山之石】DBSCAN密度聚類算法(理論+圖解+python代碼)

2021-02-13 DUT經管研究生

作者:風弦鶴CSDN

博客地址:

https://blog.csdn.net/huacha__/article/details/81094891

本文主要內容:
1、前言
2、DBSCAN聚類算法
3、參數選擇
4、DBSCAN算法迭代可視化展示
5、常用評估方法:輪廓係數
6、用Python實現DBSCAN聚類算法

一、前言

去年學聚類算法的R語言的時候,有層次聚類、系統聚類、K-means聚類、K中心聚類,最後呢,被DBSCAN聚類算法迷上了。

為什麼呢,首先它可以發現任何形狀的簇,其次我認為它的理論也是比較簡單易懂的,今年在python這門語言上我打算好好研究DBSCAN。

下面貼上它的官方解釋:

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種基於密度的空間聚類算法。

該算法將具有足夠密度的區域劃分為簇,並在具有噪聲的空間資料庫中發現任意形狀的簇,它將簇定義為密度相連的點的最大集合。

二、DBSCAN聚類算法

文字描述不好懂,先看下面這個圖:上面這些點是分布在樣本空間的眾多樣本,現在我們的目標是把這些在樣本空間中距離相近的聚成一類。

我們發現A點附近的點密度較大,紅色的圓圈根據一定的規則在這裡滾啊滾,最終收納了A附近的5個點,標記為紅色也就是定為同一個簇。

其它沒有被收納的根據一樣的規則成簇。

形象來說,我們可以認為這是系統在眾多樣本點中隨機選中一個,圍繞這個被選中的樣本點畫一個圓,規定這個圓的半徑以及圓內最少包含的樣本點,如果在指定半徑內有足夠多的樣本點在內,那麼這個圓圈的圓心就轉移到這個內部樣本點,繼續去圈附近其它的樣本點,類似傳銷一樣,繼續去發展下線。

等到這個滾來滾去的圈發現所圈住的樣本點數量少於預先指定的值,就停止了。那麼我們稱最開始那個點為核心點,如A,停下來的那個點為邊界點,如B、C,沒得滾的那個點為離群點,如N)。

基於密度這點有什麼好處呢?

我們知道kmeans聚類算法只能處理球形的簇,也就是一個聚成實心的團(這是因為算法本身計算平均距離的局限)。但往往現實中還會有各種形狀,比如下面兩張圖,環形和不規則形,這個時候,那些傳統的聚類算法顯然就悲劇了。

於是就思考,樣本密度大的成一類唄,這就是DBSCAN聚類算法。

三、參數選擇

上面提到了紅色圓圈滾啊滾的過程,這個過程就包括了DBSCAN算法的兩個參數,這兩個參數比較難指定,公認的指定方法簡單說一下:

半徑:半徑是最難指定的 ,大了,圈住的就多了,簇的個數就少了;反之,簇的個數就多了,這對我們最後的結果是有影響的。我們這個時候K距離可以幫助我們來設定半徑r,也就是要找到突變點,比如:以上雖然是一個可取的方式,但是有時候比較麻煩 ,大部分還是都試一試進行觀察,用k距離需要做大量實驗來觀察,很難一次性把這些值都選準。MinPts:這個參數就是圈住的點的個數,也相當於是一個密度,一般這個值都是偏小一些,然後進行多次嘗試四、DBSCAN算法迭代可視化展示

國外有一個特別有意思的網站,它可以把我們DBSCAN的迭代過程動態圖畫出來。

網址:naftaliharris[1]

設置好參數,點擊GO! 就開始聚類了!

還有其他的聚類實例:

聚類1聚類2

五、常用評估方法:輪廓係數

這裡提一下聚類算法中最常用的評估方法——輪廓係數(Silhouette Coefficient):

計算樣本i到同簇其它樣本到平均距離ai,ai越小,說明樣本i越應該被聚類到該簇(將ai稱為樣本i到簇內不相似度);計算樣本i到其它某簇Cj的所有樣本的平均距離bij,稱為樣本i與簇Cj的不相似度。定義為樣本i的簇間不相似度:bi=min(bi1,bi2,...,bik2);

說明:

六、用Python實現DBSCAN聚類算法

導入數據:

import pandas as pd
from sklearn.datasets import load_iris
# 導入數據,sklearn自帶鳶尾花數據集
iris = load_iris().data
print(iris)

輸出:

使用DBSCAN算法:

from sklearn.cluster import DBSCAN
 iris_db = DBSCAN(eps=0.6,min_samples=4).fit_predict(iris)
# 設置半徑為0.6,最小樣本量為2,建模
db = DBSCAN(eps=10, min_samples=2).fit(iris)
 
# 統計每一類的數量
counts = pd.value_counts(iris_db,sort=True)
print(counts)

可視化:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'Microsoft YaHei']

fig,ax = plt.subplots(1,2,figsize=(12,12))

# 畫聚類後的結果
ax1 = ax[0]
ax1.scatter(x=iris[:,0],y=iris[:,1],s=250,c=iris_db)
ax1.set_title('DBSCAN聚類結果',fontsize=20)

# 畫真實數據結果
ax2 = ax[1]
ax2.scatter(x=iris[:,0],y=iris[:,1],s=250,c=load_iris().target)
ax2.set_title('真實分類',fontsize=20)
plt.show()

我們可以從上面這個圖裡觀察聚類效果的好壞,但是當數據量很大,或者指標很多的時候,觀察起來就會非常麻煩。

這時候可以使用輪廓係數來判定結果好壞,聚類結果的輪廓係數,定義為S,是該聚類是否合理、有效的度量。

聚類結果的輪廓係數的取值在[-1,1]之間,值越大,說明同類樣本相距約近,不同樣本相距越遠,則聚類效果越好。

輪廓係數以及其他的評價函數都定義在sklearn.metrics模塊中,在sklearn中函數silhouette_score()計算所有點的平均輪廓係數。

from sklearn import metrics  
# 就是下面這個函數可以計算輪廓係數(sklearn真是一個強大的包)
score = metrics.silhouette_score(iris,iris_db) 
score

結果:0.364

參考資料[1]

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

相關焦點

  • 從零開始學Python【31】—DBSCAN聚類(實戰部分)
    前言在《從零開始學Python【30】--DBSCAN聚類(理論部分)》一文中我們側重介紹了有關密度聚類的理論知識,涉及的內容包含密度聚類中的一些重要概念
  • DBSCAN聚類算法原理總結
    DBSCAN是基於密度空間的聚類算法,在機器學習和數據挖掘領域有廣泛的應用,其聚類原理通俗點講是每個簇類的密度高於該簇類周圍的密度,噪聲的密度小於任一簇類的密度
  • 詳解DBSCAN聚類
    (DBSCAN)是一種無監督的ML聚類算法。當算法遍歷質心時,在達到穩定性和收斂性之前,離群值對質心的移動方式有顯著的影響。此外,KMeans在集群大小和密度不同的情況下還存在數據精確聚類的問題。K-Means只能應用球形簇,如果數據不是球形的,它的準確性就會受到影響。最後,KMeans要求我們首先選擇希望找到的集群的數量。下面是KMeans和DBSCAN如何聚類同一個數據集的示例。
  • 從零開始學Python【30】--DBSCAN聚類(理論部分)
    前言在第29期,我們分享了有關K均值聚類的項目實戰,本期將介紹另一種聚類算法,那就是基於密度聚類的算法。如果利用本文所接受的DBSCAN聚類算法,將不會出現這樣的問題。不妨先將DBSCAN的聚類效果呈現在下圖:
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    K均值(點之間的距離)、Affinity propagation(圖之間的距離)、均值漂移(點之間的距離)、DBSCAN(最近點之間的距離)、高斯混合(到中心的馬氏距離)、譜聚類(圖之間距離)等。2014年,DBSCAN算法在領先的數據挖掘會議ACM SIGKDD上獲得the testof time獎(授予在理論和實踐中受到廣泛關注的算法)。
  • 圖解機器學習-聚類(k均值)
    兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離如下圖:K均值聚類(K-means) 算法K均值算法偽代碼,來自周志華《機器學習》圖解分析我們現在結合圖例和python代碼一步一步分析,幫助大家理解。
  • 三種聚類方法的介紹及其R語言實現
    聚類分析的類型包括兩種Q型聚類(對樣品聚類)、R型聚類(對變量聚類)。一、聚類分析介紹聚類分析方法包括很多種,例如:系統聚類法、動態聚類法、模糊聚類法、密度聚類法等,本文主要介紹的是系統聚類法、動態聚類法與密度聚類法。
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。
  • 十分鐘學會DBSCAN算法
    由聚類所生成的簇是一組數據對象的集合,這些對象與同一個簇中的對象彼此相似,與其他簇中的對象相異。常用的聚類算法包括原型聚類、密度聚類和層次聚類三大類。其中密度聚類算法(density-based clustering)假設聚類結構能通過樣本分布的緊密程度確定。
  • 深度剖析:數據科學家需懂的5種聚類算法
    【IT168 資訊】聚類是一種涉及數據點分組的機器學習技術。給定一組數據點,我們可以使用聚類算法將每個數據點分類到一個特定的組中。理論上,屬於同一組的數據點應具有相似的屬性和特徵,而不同組中的數據點應具有高度不同的屬性和特徵。聚類是無監督學習的一種方法,是在許多領域使用統計數據分析的常用技術。
  • K均值聚類算法-Matlab代碼
    一、K均值聚類算法算法步驟如下:1、初始化已知數據集合X,及事先指定聚類的總類數N,在X中隨機選取N個對象作為初始的聚類中心。5、重複步驟3~4,滿足步驟2中的迭代終止條件時,停止Matlab代碼見下圖:K均值聚類算法-Matlab代碼二、K均值聚類算法應用舉例1、隨機生成三組數據隨機生成的三組數據
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    使用案例包括細分客戶、新聞聚類、文章推薦等。因為聚類是一種無監督學習(即數據沒有標註),並且通常使用數據可視化評價結果。如果存在「正確的回答」(即在訓練集中存在預標註的集群),那麼分類算法可能更加合適。3.1 K 均值聚類K 均值聚類是一種通用目的的算法,聚類的度量基於樣本點之間的幾何距離(即在坐標平面中的距離)。
  • ...分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R實現)
    使用案例包括細分客戶、新聞聚類、文章推薦等。因為聚類是一種無監督學習(即數據沒有標註),並且通常使用數據可視化評價結果。如果存在「正確的回答」(即在訓練集中存在預標註的集群),那麼分類算法可能更加合適。3.1 K 均值聚類K 均值聚類是一種通用目的的算法,聚類的度量基於樣本點之間的幾何距離(即在坐標平面中的距離)。
  • 5種聚類算法!數據分析師必須要掌握
    給定一組數據點,我們可以使用聚類算法將每個數據點分類到一個特定的簇中。理論上,屬於同一類的數據點應具有相似的屬性或特徵,而不同類中的數據點應具有差異很大的屬性或特徵。聚類屬於無監督學習中的一種方法,也是一種在許多領域中用於統計數據分析的常用技術。
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。>2.將數據集中的數據按照距離質心的遠近分到各個簇中3.對每個簇的數據求平均值,作為新的質心,重複上一步,直到所有的簇不再改變k是聚類個數,可以根據我們的經驗給數值,也可以通過程序初步預測k設置為多少對聚類最準確。
  • 機器學習——詳解經典聚類算法Kmeans
    所以,KMeans算法,顧名思義,就是將樣本根據用戶設置的K值,一共聚類成K個類簇。Kmeans原理不知道大家有沒有聽說過這麼一個理論,人類和計算機其實是相反的。一些對於人類來說困難的問題,對於計算機非常簡單。
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    k-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • 二十三、聚類算法介紹
    聚類算法聚類:數據對象的集合在同一個聚類中的對象彼此相似不同聚類中的對象則差別較大聚類分析將物理或抽象對象的集合分組成為由類似的對象組成的多個類的過程K-means算法基於層次的方法:CURE算法基於密度的方法:DBSCAN算法2. k-means聚類算法簡介
  • 聚類算法 Hierarchical Clustering算法
    Hierarchical Clustering算法概述HC算法,又稱層次聚類算法,就是按照某種方法進行層次分類,直到滿足某種條件為止。圖解過程Hierarchical Clustering算法函數sklearn.cluster.AgglomerativeClustering主要參數
  • 如何正確選擇聚類算法?|CSDN博文精選
    作者 | Josh Thompson翻譯 | 張睿毅校對 | 王雨桐本文將介紹四種基本的聚類算法—層次聚類、基於質心的聚類、最大期望算法和基於密度的聚類算法,並討論不同算法的優缺點。聚類算法十分容易上手,但是選擇恰當的聚類算法並不是一件容易的事。數據聚類是搭建一個正確數據模型的重要步驟。