dbscan算法_DBSCAN聚类算法探索
作者:單華
DBSCAN是非監(jiān)督學(xué)習(xí)中密度學(xué)習(xí)算法里的佼佼者。本文對DBSCAN做了簡單的探索,全文無數(shù)學(xué)公式,共2800余字。
在ARGO之前提到的聚類與K-Means一文中,提到了密度聚類方法DBSCAN算法。那么本文將對這一聚類方法進(jìn)行詳細(xì)介紹,具體包括:
- DBSCAN定義及基本概念
- 算法原理和算法流程
- 算法的優(yōu)缺點(diǎn)
- 用Scikit-learn學(xué)習(xí)DBSCAN聚類算法
一 DBSCAN定義及基本概念
DBSCAN(Density-Based SpatialClustering of Applications with Noise)是一種典型的密度聚類算法,這種聚類算法將簇視為由低密度區(qū)域隔離開來的高密度區(qū)域。由于這種相當(dāng)普遍的觀點(diǎn),DBSCAN能在有噪音的空間數(shù)據(jù)中發(fā)現(xiàn)任意形狀、大小分布的簇。
DBSCAN是基于一組鄰域來描述樣本集緊密程度的,它有兩個(gè)輸入?yún)?shù):鄰域半徑Eps 和 密度閾值 MinPts。通過這兩個(gè)參數(shù)可以區(qū)分出高密度點(diǎn)和低密度點(diǎn),簡單地說,就是某個(gè)數(shù)據(jù)點(diǎn)的鄰域半徑范圍Eps內(nèi)的數(shù)據(jù)點(diǎn)數(shù)目超過了最小包含點(diǎn)數(shù)閾值MinPts 即為高密度點(diǎn),而DBSCAN 的主要思想就是將滿足高密度的數(shù)據(jù)點(diǎn)聚類成一個(gè)簇。
對應(yīng)樣本集D, DBSCAN 算法包含基本概念如下:
- Eps鄰域:對于給定對象q(q ∈ D),q的Eps鄰域是以q為中心,Eps半徑內(nèi)的鄰域。
- 核心對象:對于給定對象q(q ∈ D),如果q的Eps鄰域至少包含最小數(shù)目MinPts的對象,則稱q為核心對象。
- 邊界對象:對于給定對象q(q ∈ D),如果q在某個(gè)核心對象的鄰域內(nèi),但又不是核心對象,則稱q為邊界對象。
- 噪音點(diǎn):既不是核心點(diǎn),也不是邊界點(diǎn)的任何點(diǎn)。
- 直接密度可達(dá):如果q在r的Eps鄰域內(nèi),而r是一個(gè)核心對象,則稱q從r直接密度可達(dá)。
- 密度可達(dá):存在對象鏈 , 。若所有的對象 從對象 關(guān)于Eps 和MinPts 直接密度可達(dá),則稱q 從p 關(guān)于Eps 和MinPts 密度可達(dá)。
- 密度相連:給定對象r, p,q ∈D,若 p 和 q 都是從 r 出發(fā),關(guān)于 Eps和MinPts 密度可達(dá)的,則稱p 和q 是關(guān)于Eps 和MinPts 密度連接的。
從下圖可以很容易理解上述概念,圖中MinPts=5,紅色的點(diǎn)是核心對象,因?yàn)槠銭ps-鄰域至少有5個(gè)樣本。黑色的點(diǎn)是非核心對象。所有核心對象直接密度可達(dá)的樣本在以紅色核心對象為中心的超球體內(nèi),如果不在超球體內(nèi),則不能直接密度可達(dá)。圖中用綠色箭頭連起來的核心對象組成了密度可達(dá)的樣本序列。在這些密度可達(dá)的樣本序列的Eps-鄰域內(nèi)所有的樣本相互都是密度相連的。而那些不在任何超求體內(nèi)的黑點(diǎn)則成為噪聲。
二 算法原理和算法流程
DBSCAN算法的基本思路很簡單:它從數(shù)據(jù)對象集合D 中任意沒有類別的對象q開始,尋找從q 關(guān)于參數(shù)Eps 和MinPts 密度可達(dá)的所有對象,組成一個(gè)聚類。DBSCAN的聚類過程也叫密度擴(kuò)展,整個(gè)過程由迭代的鄰域搜索來完成。“具體做法是從某一核心點(diǎn)出發(fā),不斷的向密度可達(dá)的區(qū)域擴(kuò)張,得到一個(gè)包含核心點(diǎn)和邊界點(diǎn)的最大區(qū)域,這個(gè)區(qū)域中任意兩點(diǎn)密度相連”。
根據(jù)上述分析,我們可以將DBSCAN 算法描述如下:
輸入:包含n 個(gè)對象的數(shù)據(jù)集D,鄰域半徑Eps,密度閾值MinPts。期待輸出:所有生成的簇。
1 初始化參數(shù):設(shè)置數(shù)據(jù)庫中所有對象為噪聲和未訪問。
2 從數(shù)據(jù)庫中任選一個(gè)未被訪問的核心對象,以該對象作為起始對象建立一個(gè)新類,遞歸地找出所有從該對象密度可達(dá)的對象,加入到該類中,并標(biāo)記為已訪問;
3 直到所有的對象都被訪問,輸出聚類結(jié)果,算法結(jié)束;否則轉(zhuǎn)2步。
用流程圖描述如下:
三 算法的優(yōu)缺點(diǎn)
DBSCAN算法是基于密度聚類的代表,針對前面的算法描述,我們對DBSCAN算法的優(yōu)缺點(diǎn)做一個(gè)總結(jié)。
DBSCAN具有以下主要優(yōu)點(diǎn):
1) 對噪聲數(shù)據(jù)不敏感,可以發(fā)現(xiàn)空間中任意形狀和大小的簇;
2) 由于只掃描一次整個(gè)數(shù)據(jù)庫,算法是高效的;
3) 與K-means比起來,不需要輸入類別的個(gè)數(shù);
4) 聚類結(jié)果幾乎不依賴于點(diǎn)遍歷順序。
但DBSCAN也存在如下一些缺點(diǎn):
1) 高內(nèi)存和I/O消耗:隨著輸入數(shù)據(jù)集規(guī)模的增大,由于算法將整個(gè)數(shù)據(jù)集加載到內(nèi)存,對內(nèi)存和I/O消耗較高;
2) 對輸入?yún)?shù)Eps敏感:鄰域半徑Eps 是由用戶在進(jìn)行聚類前指定的,但實(shí)際上,在沒有關(guān)于數(shù)據(jù)集的領(lǐng)域知識的指導(dǎo)下,很難確定合適的參數(shù)。然而聚類結(jié)果卻與該參數(shù)有著很大關(guān)系:如果Eps過大,就可能將距離較遠(yuǎn)的幾個(gè)簇合并起來,或者將噪聲數(shù)據(jù)添加到簇中;如果過小,就可能把一個(gè)簇分割成幾個(gè)更小的簇,或者將有用的數(shù)據(jù)識別為噪聲。
為了輔助參數(shù)Eps 的確定,DBSCAN 算法提供了一種可視化的方法:給定k值,計(jì)算數(shù)據(jù)庫中每個(gè)對象與其第k 最近鄰居之間的距離kdist,并對kdist 值由大到小排序,隨后以對象在排序后的kdist 序列中的序號作為橫坐標(biāo),對應(yīng)的kdist值(圖中為4dist)作為縱坐標(biāo),繪制出二維kdist 曲線圖。用戶將kdist曲線由陡峭轉(zhuǎn)為平緩的拐點(diǎn)處的kdist 值設(shè)置為參數(shù)Eps。在實(shí)際操作中,通過這種交互式方法確定的Eps 具有一定的合理性,但需要過多的人工參與。
3) 不能有效地對密度差異較大的數(shù)據(jù)集進(jìn)行聚類:如果樣本集的密度不均勻、聚類間距差相差很大時(shí),聚類質(zhì)量較差,這時(shí)用DBSCAN聚類一般不適合。
四 用Scikit-learn學(xué)習(xí)DBSCAN聚類算法
在scikit-learn中,我們直接使用sklearn-cluster.DBSCAN調(diào)用封裝好的DBSCAN聚類函數(shù)。
我們隨機(jī)生成一組數(shù)據(jù)樣本點(diǎn),其中兩組數(shù)據(jù)是非凸的,一組為凸的。代碼如下所示:
import numpy as np import matplotlib.pyplot as plt from sklearn import datasetsX1, y1=datasets.make_circles(n_samples=1000, factor=.7,noise=.035) X2, y2 = datasets.make_blobs(n_samples=500, n_features=2, centers=[[1.5,1.5]], cluster_std=[[.075]],random_state=9)X = np.concatenate((X1, X2)) plt.scatter(X[:, 0], X[:, 1], marker='o') plt.show()其點(diǎn)分布如下:
使用K-Means聚類
看一下K-means算法的分類效果,假設(shè)分為三類,代碼如下:
from sklearn.cluster import KMeans y_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show()下面的K-means聚類效果圖很明顯,并不是我們想要的聚類結(jié)果。
使用DBCAN進(jìn)行聚類
DBSCAN的初始函數(shù)的參數(shù),初始化函數(shù)如下
_int_(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1)[eps] DBSCAN算法參數(shù),兩個(gè)樣本被看作鄰居的最大距離,即掃描半徑,默認(rèn)值是0.5。但是eps如果選擇過大,則會(huì)有很多的樣本點(diǎn)落入核心對象的鄰域內(nèi),這時(shí)就會(huì)導(dǎo)致劃分的類別減少;而如果eps選擇過小,就會(huì)導(dǎo)致劃分的類別增多,本來是一類的樣本可能就會(huì)被分開。
[min_samples] 即前面提到的MinPts參數(shù),作為核心對象鄰域中的最小樣本數(shù),默認(rèn)值是5。通常和eps一起調(diào)參。而且在eps值一定的情況下,min_sample偏大,則核心對象會(huì)減少,這時(shí)本來是一類的樣本可能會(huì)被標(biāo)記為噪音點(diǎn),類別也會(huì)變多。反之min_sample偏小的話,核心對象就會(huì)增多,導(dǎo)致劃分的類別減少。
[algorithm]最近鄰搜索算法參數(shù),有四種“auto,ball_tree,kd_tree,brute”,一般使用默認(rèn)的“auto”就夠了,它會(huì)從其他三個(gè)算法中做權(quán)衡,選擇一個(gè)擬合最好的最優(yōu)算法。但是如果輸入樣本是稀疏的,則會(huì)自動(dòng)選擇“brute”算法搜索。
[metric,leaf_size,p,n_jobs]對于這幾個(gè)參數(shù),可以參考前面KNN算法一文中的詳細(xì)介紹,這里不再做說明。
上述介紹了DBSCAN函數(shù)的參數(shù)后,我們開始對輸入的參數(shù)進(jìn)行調(diào)整。從默認(rèn)函數(shù)的分類效果可以發(fā)現(xiàn),劃分的類別比我們期望的少,那么可以通過增大min_samples,減小eps半徑來達(dá)到我們的目的:
from sklearn.cluster import DBSCAN y_pred = DBSCAN(eps=0.1,min_samples = 10).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.show()那么我們再來看看這時(shí)的聚類效果圖如何吧:
明顯的,與我們期望的劃分結(jié)果完全符合。
總結(jié)
本文從DBSCAN算法的基本原理講起,中間介紹了DBSCAN的算法流程,并在末節(jié)用實(shí)戰(zhàn)展示了DBSCAN和KMeans的區(qū)別和使用。DBSCAN在特征工程中對于發(fā)現(xiàn)噪音點(diǎn)也有使用場景,是使用比較廣泛的一種聚類方式。
原文鏈接
DBSCAN聚類算法探索?mp.weixin.qq.com總結(jié)
以上是生活随笔為你收集整理的dbscan算法_DBSCAN聚类算法探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python网络通信编程实例_pytho
- 下一篇: c判断char数组是否为空_你学过数组,