機器學習之DBSCAN聚類算法

DBSCAN算法簡介

DBSCAN(Density-Based Spatial Clustering of Applications with Noise铅乡,具有噪聲的基于密度的聚類方法)是一種基于密度的空間聚類算法斧拍。 該算法將具有足夠密度的區(qū)域劃分為簇,并在具有噪聲的空間數(shù)據(jù)庫中發(fā)現(xiàn)任意形狀的簇旧巾,它將簇定義為密度相連的點的最大集合。

DBSCAN算法原理

DBSCAN參數(shù)

1)eps: DBSCAN算法參數(shù)暑认,即我們的??-鄰域的距離閾值嫉晶,和樣本距離超過??的樣本點不在??-鄰域內(nèi)叶洞。默認值是0.5.一般需要通過在多組值里面選擇一個合適的閾值。eps過大寸爆,則更多的點會落在核心對象的??-鄰域礁鲁,此時我們的類別數(shù)可能會減少, 本來不應(yīng)該是一類的樣本也會被劃為一類赁豆。反之則類別數(shù)可能會增大仅醇,本來是一類的樣本卻被劃分開。

2)min_samples: DBSCAN算法參數(shù)魔种,即樣本點要成為核心對象所需要的??-鄰域的樣本數(shù)閾值析二。默認值是5. 一般需要通過在多組值里面選擇一個合適的閾值。通常和eps一起調(diào)參节预。在eps一定的情況下叶摄,min_samples過大,則核心對象會過少安拟,此時簇內(nèi)部分本來是一類的樣本可能會被標為噪音點蛤吓,類別數(shù)也會變多。反之min_samples過小的話糠赦,則會產(chǎn)生大量的核心對象会傲,可能會導(dǎo)致類別數(shù)過少。

3)metric:最近鄰距離度量參數(shù)拙泽。

4)algorithm:最近鄰搜索算法參數(shù)唆铐,算法一共有三種,第一種是蠻力實現(xiàn)奔滑,第二種是KD樹實現(xiàn)艾岂,第三種是球樹實現(xiàn)。這三種方法在K近鄰法(KNN)原理小結(jié)中都有講述朋其,如果不熟悉可以去復(fù)習下王浴。對于這個參數(shù)脆炎,一共有4種可選輸入,‘brute’對應(yīng)第一種蠻力實現(xiàn)氓辣,‘kd_tree’對應(yīng)第二種KD樹實現(xiàn)秒裕,‘ball_tree’對應(yīng)第三種的球樹實現(xiàn), ‘a(chǎn)uto’則會在上面三種算法中做權(quán)衡钞啸,選擇一個擬合最好的最優(yōu)算法几蜻。需要注意的是,如果輸入樣本特征是稀疏的時候体斩,無論我們選擇哪種算法梭稚,最后scikit-learn都會去用蠻力實現(xiàn)‘brute’。個人的經(jīng)驗絮吵,一般情況使用默認的 ‘a(chǎn)uto’就夠了弧烤。 如果數(shù)據(jù)量很大或者特征也很多,用"auto"建樹時間可能會很長蹬敲,效率不高暇昂,建議選擇KD樹實現(xiàn)‘kd_tree’,此時如果發(fā)現(xiàn)‘kd_tree’速度比較慢或者已經(jīng)知道樣本分布不是很均勻時伴嗡,可以嘗試用‘ball_tree’急波。而如果輸入樣本是稀疏的,無論你選擇哪個算法最后實際運行的都是‘brute’瘪校。

5)leaf_size:最近鄰搜索算法參數(shù)澄暮,為使用KD樹或者球樹時, 停止建子樹的葉子節(jié)點數(shù)量的閾值渣淤。這個值越小赏寇,則生成的KD樹或者球樹就越大,層數(shù)越深价认,建樹時間越長嗅定,反之,則生成的KD樹或者球樹會小用踩,層數(shù)較淺渠退,建樹時間較短。默認是30. 因為這個值一般只影響算法的運行速度和使用內(nèi)存大小脐彩,因此一般情況下可以不管它碎乃。

6) p: 最近鄰距離度量參數(shù)。只用于閔可夫斯基距離和帶權(quán)重閔可夫斯基距離中p值的選擇惠奸,p=1為曼哈頓距離梅誓, p=2為歐式距離。如果使用默認的歐式距離不需要管這個參數(shù)。

待聚類點分為三類:

1)核心點:如果一個對象在其半徑 eps 內(nèi)含有超過 MinPts 數(shù)目的點梗掰,則該對象為核心點嵌言。(如下圖點A)
2)邊界點:如果一個對象在其半徑 eps 內(nèi)含有點的數(shù)量小于 MinPts,但是該對象落在核心點的鄰域內(nèi)及穗,則該對象為邊界點摧茴。(如下圖點B、C)
3)噪音點:如果一個對象既不是核心點也不是邊界點埂陆,則該對象為噪音點苛白。(如下圖點N)


待聚類圖
算法流程

1)DBSCAN通過檢查數(shù)據(jù)集中每個點的r鄰域來搜索簇,如果點p的r鄰域包含多于MinPts個點焚虱,則創(chuàng)建一個以p為核心對象的簇购裙;
2)DBSCAN迭代的聚集從這些核心對象直接密度可達的對象,這個過程可能涉及一些密度可達簇的合并著摔;
3)當沒有新的帶你添加到任何簇時缓窜,迭代過程結(jié)束定续。

DBSCAN算法python代碼實現(xiàn)

# Author:Sunshine丶天
from sklearn import datasets
import numpy as np
import random
import matplotlib.pyplot as plt


def findNeighbor(j, X, eps):
    N = []
    for p in range(X.shape[0]):  # 找到所有領(lǐng)域內(nèi)對象
        temp = np.sqrt(np.sum(np.square(X[j] - X[p])))  # 歐氏距離
        if (temp <= eps):
            N.append(p)
    return N


def dbscan(X, eps, min_Pts):
    k = -1
    NeighborPts = []  # array,某點領(lǐng)域內(nèi)的對象
    Ner_NeighborPts = []
    fil = []  # 初始時已訪問對象列表為空
    gama = [x for x in range(len(X))]  # 初始時將所有點標記為未訪問
    cluster = [-1 for y in range(len(X))]
    while len(gama) > 0:
        j = random.choice(gama)
        gama.remove(j)  # 未訪問列表中移除
        fil.append(j)  # 添加入訪問列表
        NeighborPts = findNeighbor(j, X, eps)
        if len(NeighborPts) < min_Pts:
            cluster[j] = -1  # 標記為噪聲點
        else:
            k = k + 1
            cluster[j] = k
            for i in NeighborPts:
                if i not in fil:
                    gama.remove(i)
                    fil.append(i)
                    Ner_NeighborPts = findNeighbor(i, X, eps)
                    if len(Ner_NeighborPts) >= min_Pts:
                        for a in Ner_NeighborPts:
                            if a not in NeighborPts:
                                NeighborPts.append(a)
                    if (cluster[i] == -1):
                        cluster[i] = k
    return cluster


X1, y1 = datasets.make_circles(n_samples=2000, factor=.6, noise=.05)
X2, y2 = datasets.make_blobs(n_samples=500, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[.1]],
                             random_state=666)
X = np.concatenate((X1, X2))
eps = 0.1
min_Pts = 10

cluster = dbscan(X, eps, min_Pts)
plt.figure(figsize=(12, 9), dpi=80)
plt.scatter(X[:, 0], X[:, 1], c=cluster)
plt.show()
DBSCAN算法python代碼實現(xiàn)效果圖g

DBSCAN算法sklearn實現(xiàn)

from sklearn.cluster import DBSCAN
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt

X1, y1 = datasets.make_circles(n_samples=2000, factor=.6, noise=.05)
X2, y2 = datasets.make_blobs(n_samples=500, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[.1]],
                             random_state=666)
X = np.concatenate((X1, X2))
eps = 0.1
min_Pts = 10

y_pred = DBSCAN(eps=eps, min_samples=min_Pts, metric='euclidean', metric_params=None, algorithm='auto').fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
DBSCAN算法sklearn實現(xiàn)效果圖

DBSCAN算法優(yōu)缺點

優(yōu)點:

(1)聚類速度快且能夠有效處理噪聲點和發(fā)現(xiàn)任意形狀的空間聚類谍咆;
(2)與K-MEANS比較起來,不需要輸入要劃分的聚類個數(shù)私股;
(3)聚類簇的形狀沒有偏倚摹察;
(4)可以在需要時輸入過濾噪聲的參數(shù)。

缺點:

(1)當數(shù)據(jù)量增大時倡鲸,要求較大的內(nèi)存支持I/O消耗也很大供嚎,聚類收斂時間較長,此時可以對搜索最近鄰時建立的 KD 樹或者球樹進行規(guī)模限制來進行改進峭状;
(2)當空間聚類的密度不均勻克滴、聚類間距差相差很大時,聚類質(zhì)量較差优床,因為這種情況下參數(shù)min_samples和eps選取困難劝赔;
(3)算法聚類效果依賴與距離公式選取,實際應(yīng)用中常用歐式距離胆敞,對于高維數(shù)據(jù)着帽,存在“維數(shù)災(zāi)難”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末移层,一起剝皮案震驚了整個濱河市仍翰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌观话,老刑警劉巖予借,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡灵迫,警方通過查閱死者的電腦和手機喧笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龟再,“玉大人书闸,你說我怎么就攤上這事±眨” “怎么了浆劲?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哀澈。 經(jīng)常有香客問我牌借,道長,這世上最難降的妖魔是什么割按? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任膨报,我火速辦了婚禮,結(jié)果婚禮上适荣,老公的妹妹穿的比我還像新娘现柠。我一直安慰自己,他們只是感情好弛矛,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布够吩。 她就那樣靜靜地躺著,像睡著了一般丈氓。 火紅的嫁衣襯著肌膚如雪周循。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天万俗,我揣著相機與錄音湾笛,去河邊找鬼。 笑死闰歪,一個胖子當著我的面吹牛嚎研,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播课竣,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘉赎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了于樟?” 一聲冷哼從身側(cè)響起公条,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迂曲,沒想到半個月后靶橱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年关霸,在試婚紗的時候發(fā)現(xiàn)自己被綠了传黄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡队寇,死狀恐怖膘掰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佳遣,我是刑警寧澤识埋,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站零渐,受9級特大地震影響窒舟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诵盼,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一惠豺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧风宁,春花似錦洁墙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍苞。三九已至固翰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間羹呵,已是汗流浹背骂际。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冈欢,地道東北人歉铝。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像凑耻,于是被迫代替她去往敵國和親太示。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容