DBSCAN聚類算法難嗎?我們來看看吧~

往期經典回顧

從零開始學Python【29】--K均值聚類(實戰部分)

從零開始學Python【28】--K均值聚類(理論部分)

從零開始學Python【27】--Logistic迴歸(實戰部分)

從零開始學Python【26】--Logistic迴歸(理論部分)

從零開始學Python【25】--嶺迴歸及LASSO迴歸(實戰部分)

 

距離上一篇從零開始學Python系列已將近1年,在這一年中我一直忙於新書的編寫,如今新書已上市,即《從零開始學Python數據分析與挖掘》。接下來我可以繼續分享Python相關的知識點,主題包含數據可視化、數據分析和數據挖掘。

 

前言

在第29期,我們分享了有關K均值聚類的項目實戰,本期將介紹另一種聚類算法,那就是基於密度聚類的算法。該算法的最大優點是可以將非球形簇實現恰到好處的聚類,如下圖所示,即爲一個非球形的典型圖形:

如上圖所示,右上角的樣本點爲一個簇,呈現球形特徵,但是左下角的兩個樣本簇,存在交合狀態,並非球形分佈。如果直接使用K均值聚類算法,將圖形中的數據,聚爲三類,將會形成下圖的效果:

如上圖所示,K均值聚類的效果很顯然存在差錯。如果利用本文所接受的DBSCAN聚類算法,將不會出現這樣的問題。不妨先將DBSCAN的聚類效果呈現在下圖:

如上圖所示,基於密度聚類的算法(DBSCAN),就可以得到非常理想的聚類效果。接下來需要分享一下,爲什麼DBSCAN可以做到完美的聚類。

 

 

DBSCAN理論--基本概念

密度聚類算法中的“密度”一詞,可以理解爲樣本點的緊密程度,而緊密度的衡量則需要使用半徑和最小樣本量進行評估,如果在指定的半徑領域內,實際樣本量超過給定的最小期望樣本量,則認爲是高密度對象。那麼問題來了,該算法是如何基於半徑和最小樣本量完成聚類的呢?回答這個問題之前,需要理解一些基本概念:

點的領域:在某點p處,給定其半徑後,所得到的覆蓋區域;

核心對象:對於給定的最少樣本量MinPts而言,如果某點p的領域內至少包含MinPts個樣本點,則點p就爲核心對象;

直接密度可達:假設點p爲核心對象,且在點p的領域內存在點q,則從點p出發到點q是直接密度可達的;

密度可達:假設存在一系列的對象鏈,如果是關於半徑和最少樣本點MinPts的直接密度可達),則密度可達

密度相連:假設點o爲核心對象,從點o出發得到兩個密度可達點p和點q,則稱點p和點q是密度相連的;

聚類的簇:簇包含了最大的密度相連所構成的樣本點;

邊界點:假設點p爲核心對象,在其領域內包含了點b,如果點b爲非核心對象,則稱其爲點p的邊界點;

異常點:是指不屬於任何簇的樣本點;

 

爲使讀者很好的理解上面的概念,以及它們之間的差異,可以參考下面的圖片:

如上圖所示,如果爲3,MinPts爲7,則點p爲核心對象(因爲在其領域內至少包含了7個樣本點);點q爲非核心對象;點m爲點p的直接密度可達(因爲它在點p的領域內)。

如上圖所示,如果爲3,MinPts爲7,則點爲核心對象;點爲非核心對象;點直接密度可達點、點直接密度可達點、點直接密度可達點,所以點密度可達點;點爲核心點的邊界點。

        如上圖所示,如果爲3,MinPts爲7,則點爲核心對象;點爲非核心對象;由於點密度可達點,並且點密度可達點,則稱點和點是密度相連的,如果點和點是最大的密度相連,則上圖中的所有樣本點構成一個簇;由於點不屬於上圖中呈現的簇,故將其判斷爲異常點。

 

DBSCAN理論--基本步驟

輸入:包含n個對象的集合D,指定半徑和最少樣本量MinPts。

輸出:所有生成的簇,達到密度要求。

1)repeat

2)從集合D中抽取一個未處理的點;

3)如果抽出的點是核心點,則找出所有從該點出發的密度可達對象,形成簇;

4)如果抽出點的爲非核心點,則跳出循環,尋找下一個點;

5)until所有點都被處理。

 

這裏用一個簡單的例子敘述DBSCAN算法步驟,以說明該方法的思路和操作過程:

首先看一下數據集合D:

第1步:在集合D中選擇點1,以它爲圓心,1爲半徑畫圓,發現僅有2個點在圓內,因此點1不爲核心點,選擇下一個點;

第2步:在集合D中選擇點2,以它爲圓心,1爲半徑畫圓,發現僅有2個點在圓內,因此點2不爲核心點,選擇下一個點;

第3步:在集合D中選擇點3,以它爲圓心,1爲半徑畫圓,發現僅有3個點在圓內,因此點3不爲核心點,選擇下一個點;

第4步:在集合D中選擇點4,以它爲圓心,1爲半徑畫圓,發現有5個點在圓內,因此點4爲核心點,接着尋找從該點出發的直接可達。聚成新類{1,3,4,5,9,10,12},完成後繼續選擇下一個點;

第5步:在集合D中選擇點5,發現該點已在簇1中,選擇下一個點;

第6步:在集合D中選擇點6,以它爲圓心,1爲半徑畫圓,發現僅有3個點在圓內,因此點6不爲核心點,選擇下一個點;

第7步:在集合D中選擇點7,以它爲圓心,1爲半徑畫圓,發現有5個點在圓內,因此點7也爲核心點,接着尋找從該點出發的直接可達。聚成新類{2,6,7,8,11},完成後繼續選擇下一個點;

第8步:在集合D中選擇點8,發現該點已在簇2中,選擇下一個點;

第9步:在集合D中選擇點9,發現該點已在簇1中,選擇下一個點;

第10步:在集合D中選擇點10,發現該點已在簇1中,選擇下一個點;

第11步:在集合D中選擇點11,發現該點已在簇2中,選擇下一個點;

第12步:在集合D中選擇點12,發現該點已在簇1中,此時所有點都被處理過,程序結束。

最終,通過這一流程下來,發現這12個點的集合D可以形成2個簇

 

DBSCAN的缺點

1)需要爲算法指定eps和MinPts參數,這對分析人員是一個很大的挑戰;

2)DBSCAN聚類算法對參數eps和MinPts的設置是非常敏感的,如果指定不當,該算法將造成聚類質量的下降。

 

結語

OK,關於密度聚類算法的理論部分我們就分享到這裏,在《從零開始學Python數據分析與挖掘》一書中,對密度聚類算法也作了更多的講解。下一期我們將針對該算法使用Python進行實戰分析。如果你有任何問題,歡迎在公衆號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的人學習和進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章