1. 程式人生 > >DBSCAN聚類演算法難嗎?我們來看看吧~

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進行實戰分析。如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的人學習和進步。