機器學習-聚類分析之DBSCAN

gao_vip發表於2020-11-22

DBSCAN聚類

DBSCAN官方文件:
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html
GitHub文件地址:https://github.com/gao7025/cluster_dbscan.git


基本概念

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法)是一種基於密度的空間聚類演算法。 該演算法將具有足夠密度的區域劃分為簇,並在具有噪聲的空間資料庫中發現任意形狀的簇,它將簇定義為密度相連的點的最大集合。

*class sklearn.cluster.DBSCAN(eps=0.5, , min_samples=5, metric=‘euclidean’, metric_params=None, algorithm=‘auto’, leaf_size=30, p=None, n_jobs=None)

DBSCAN演算法是一種基於密度的聚類演算法,其優勢是聚類的時候不需要預先指定簇的個數,其會根據設定的引數確定最終的聚類個數及形態,DBSCAN演算法將資料點分為三類:

  • 核心點:在半徑Eps內含有超過MinPts數目的點。
  • 邊界點:在半徑Eps內點的數量小於MinPts,但是落在核心點的鄰域內的點。
  • 噪音點:既不是核心點也不是邊界點的點。

在這裡插入圖片描述

主要步驟

隨機取距離半徑eps=2,最小數量minpts=3為例

  1. 對每個點計算其鄰域eps=2內點的集合
  2. 集合內點的個數超過minpts=3的點為核心點,檢視剩餘點是否在核心點的領域內,若在則為邊界點,否則為噪聲點
  3. 將距離不超過eps=2的點相互連線,構成一個簇,注意核心點領域內的點也要被加入到這個簇中

兩個引數的選擇

從聚類的過程看,選取的距離半徑和簇內最小數量兩個引數對結果影響很大,主要有兩個方法可以嘗試下:

  1. 通過找到所有點中距離最大的進行分割確定距離半徑
  2. 距離半徑和最小數量組合尋優

程式碼示例

def dbscan_clusters(X, y):
    np.random.seed(123)
    if y == 'y':
        scaler = MinMaxScaler()
        scaler.fit(X.astype(float))
        X = scaler.transform(X)
    dbs = DBSCAN(eps=0.5,  # 鄰域半徑
           min_samples=5,  # 最小樣本點數,MinPts
           metric='euclidean',
           metric_params=None,
           algorithm='auto',  # 'auto','ball_tree','kd_tree','brute',4個可選的引數 尋找最近鄰點的演算法
           leaf_size=10,  # balltree,cdtree的引數
           p=None,
           n_jobs=2)
    dbs.fit(X)
    return X, dbs

部分結果展示
在這裡插入圖片描述

詳細程式碼和資料見
https://github.com/gao7025/cluster_dbscan

相關文章