用scikit-learn學習DBSCAN聚類

來源:互聯網
上載者:User

標籤:產生   man   algo   image   clip   nat   dbscan   聚類   algorithm   

    在DBSCAN密度聚類演算法中,我們對DBSCAN聚類演算法的原理做了總結,本文就對如何用scikit-learn來學習DBSCAN聚類做一個總結,重點講述參數的意義和需要調參的參數。

1. scikit-learn中的DBSCAN類

    在scikit-learn中,DBSCAN演算法類為sklearn.cluster.DBSCAN。要熟練的掌握用DBSCAN類來聚類,除了對DBSCAN本身的原理有較深的理解以外,還要對最近鄰的思想有一定的理解。集合這兩者,就可以玩轉DBSCAN了。

2. DBSCAN類重要參數

    DBSCAN類的重要參數也分為兩類,一類是DBSCAN演算法本身的參數,一類是最近鄰度量的參數,下面我們對這些參數做一個總結。

    1)eps: DBSCAN演算法參數,即我們的$\epsilon$-鄰域的距離閾值,和樣本距離超過$\epsilon$的樣本點不在$\epsilon$-鄰域內。預設值是0.5.一般需要通過在多組值裡面選擇一個合適的閾值。eps過大,則更多的點會落在核心對象的$\epsilon$-鄰域,此時我們的類別數可能會減少, 本來不應該是一類的樣本也會被劃為一類。反之則類別數可能會增大,本來是一類的樣本卻被劃分開。

    2)min_samples: DBSCAN演算法參數,即樣本點要成為核心對象所需要的$\epsilon$-鄰域的樣本數閾值。預設值是5. 一般需要通過在多組值裡面選擇一個合適的閾值。通常和eps一起調參。在eps一定的情況下,min_samples過大,則核心對象會過少,此時簇內部分本來是一類的樣本可能會被標為噪音點,類別數也會變多。反之min_samples過小的話,則會產生大量的核心對象,可能會導致類別數過少。

    3)metric:最近鄰距離度量參數。可以使用的距離度量較多,一般來說DBSCAN使用預設的歐式距離(即p=2的閔可夫斯基距離)就可以滿足我們的需求。可以使用的距離度量參數有:

    a) 歐式距離 “euclidean”: $ \sqrt{\sum\limits_{i=1}^{n}(x_i-y_i)^2} $

    b) 曼哈頓距離 “manhattan”: $ \sum\limits_{i=1}^{n}|x_i-y_i| $

    c) 切比雪夫距離“chebyshev”: $ max|x_i-y_i|  (i = 1,2,...n)$

    d) 閔可夫斯基距離 “minkowski”: $ \sqrt[p]{\sum\limits_{i=1}^{n}(|x_i-y_i|)^p} $ p=1為曼哈頓距離, p=2為歐式距離。

    e) 帶權重閔可夫斯基距離 “wminkowski”: $ \sqrt[p]{\sum\limits_{i=1}^{n}(w*|x_i-y_i|)^p} $ 其中w為特徵權重

    f) 標準化歐式距離 “seuclidean”: 即對於各特徵維度做了歸一化以後的歐式距離。此時各樣本特徵維度均值為0,方差為1.

    g) 馬氏距離“mahalanobis”:$\sqrt{(x-y)^TS^{-1}(x-y)}$ 其中,$S^{-1}$為樣本共變數矩陣的逆矩陣。當樣本分布獨立時, S為單位矩陣,此時馬氏距離等同於歐式距離。

  還有一些其他不是實數的距離度量,一般在DBSCAN演算法用不上,這裡也就不列了。

    4)algorithm:最近鄰搜尋演算法參數,演算法一共有三種,第一種是蠻力實現,第二種是KD樹實現,第三種是球樹實現。這三種方法在K近鄰法(KNN)原理小結中都有講述,如果不熟悉可以去複習下。對於這個參數,一共有4種可選輸入,‘brute’對應第一種蠻力實現,‘kd_tree’對應第二種KD樹實現,‘ball_tree’對應第三種的球樹實現, ‘auto’則會在上面三種演算法中做權衡,選擇一個擬合最好的最優演算法。需要注意的是,如果輸入樣本特徵是稀疏的時候,無論我們選擇哪種演算法,最後scikit-learn都會去用蠻力實現‘brute’。個人的經驗,一般情況使用預設的 ‘auto’就夠了。 如果資料量很大或者特徵也很多,用"auto"建樹時間可能會很長,效率不高,建議選擇KD樹實現‘kd_tree’,此時如果發現‘kd_tree’速度比較慢或者已經知道樣本分布不是很均勻時,可以嘗試用‘ball_tree’。而如果輸入樣本是稀疏的,無論你選擇哪個演算法最後實際啟動並執行都是‘brute’。

    5)leaf_size:最近鄰搜尋演算法參數,為使用KD樹或者球樹時, 停止建子樹的葉子節點數量的閾值。這個值越小,則產生的KD樹或者球樹就越大,層數越深,建樹時間越長,反之,則產生的KD樹或者球樹會小,層數較淺,建樹時間較短。預設是30. 因為這個值一般隻影響演算法的運行速度和使用記憶體大小,因此一般情況下可以不管它。

    6) p: 最近鄰距離度量參數。只用於閔可夫斯基距離和帶權重閔可夫斯基距離中p值的選擇,p=1為曼哈頓距離, p=2為歐式距離。如果使用預設的歐式距離不需要管這個參數。

    以上就是DBSCAN類的主要參數介紹,其實需要調參的就是兩個參數eps和min_samples,這兩個值的組合對最終的聚類效果有很大的影響。

3. scikit-learn DBSCAN聚類執行個體

    首先,我們產生一組隨機資料,為了體現DBSCAN在非凸資料的聚類優點,我們產生了三簇資料,兩組是非凸的。代碼如下:

import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasets%matplotlib inlineX1, y1=datasets.make_circles(n_samples=5000, factor=.6,                                      noise=.05)X2, y2 = datasets.make_blobs(n_samples=1000, n_features=2, centers=[[1.2,1.2]], cluster_std=[[.1]],               random_state=9)X = np.concatenate((X1, X2))plt.scatter(X[:, 0], X[:, 1], marker=‘o‘)plt.show()

    可以直觀看看我們的樣本資料分布輸出:

    首先我們看看K-Means的聚類效果,代碼如下:

from sklearn.cluster import KMeansy_pred = KMeans(n_clusters=3, random_state=9).fit_predict(X)plt.scatter(X[:, 0], X[:, 1], c=y_pred)plt.show()

    K-Means對於非凸資料集的聚類表現不好,從上面代碼輸出的聚類可以明顯看出,輸出圖如下:

    那麼如果使用DBSCAN效果如何呢?我們先不調參,直接用預設參數,看看聚類效果,代碼如下:

from sklearn.cluster import DBSCANy_pred = DBSCAN().fit_predict(X)plt.scatter(X[:, 0], X[:, 1], c=y_pred)plt.show()

    發現輸出讓我們很不滿意,DBSCAN居然認為所有的資料都是一類!輸出如下:

    怎麼辦?看來我們需要對DBSCAN的兩個關鍵的參數eps和min_samples進行調參!從我們可以發現,類別數太少,我們需要增加類別數,那麼我們可以減少$\epsilon$-鄰域的大小,預設是0.5,我們減到0.1看看效果。代碼如下:

y_pred = DBSCAN(eps = 0.1).fit_predict(X)plt.scatter(X[:, 0], X[:, 1], c=y_pred)plt.show()

    對應的聚類如下:

 

    可以看到聚類效果有了改進,至少邊上的那個簇已經被發現出來了。此時我們需要繼續調參增加類別,有兩個方向都是可以的,一個是繼續減少eps,另一個是增加min_samples。我們現在將min_samples從預設的5增加到10,代碼如下:

y_pred = DBSCAN(eps = 0.1, min_samples = 10).fit_predict(X)plt.scatter(X[:, 0], X[:, 1], c=y_pred)plt.show()

    輸出的如下:

 

    可見現在聚類效果基本已經可以讓我們滿意了。

    上面這個例子只是幫大家理解DBSCAN調參的一個基本思路,在實際運用中可能要考慮很多問題,以及更多的參數組合,希望這個例子可以給大家一些啟發。

 

(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected])

    ? ?

-鄰域
? ?

-鄰域

用scikit-learn學習DBSCAN聚類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.