天天看點

DBSCAN聚類

  物以類聚,人以群分,平常我們把人和物進行分類,今天來講一講如何通過DBSCAN用資料把樣本進行聚類。

1. DBSCAN 定義

  DBSCAN (Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法。與K均值聚類和層次聚類不同,它将簇定義為密度相連的點的最大集合,能夠把具有足夠高密度的區域劃分為簇,并可在噪聲的空間資料庫中發現任意形狀的聚類。

2. DBSCAN 的原理

2.1 DBSCAN中幾個常見的定義

Ε鄰域: 以某個點為中心,半徑為E畫圓,圍成的區域稱為該點的E鄰域

核心對象: 如果某點E鄰域内的樣本點數大于等于MinPts(一般為自己設定大于1的正整數),則該點為核心對象

直接密度可達: 如果p為核心對象, q在p的E鄰域中,稱q從對象p直接密度可達,注意p不一定從對象q直接密度可達,除非q也是核心對象。

密度可達: 對于樣本集合D,給定一串樣本點{p1,p2….pn},p= p1,q= pn,假如對象pi從pi-1直接密度可達,那麼對象q從對象p密度可達。

密度相連: 存在樣本集合D中的一點o,如果對象o到對象p和對象q都是密度可達的,那麼p和q密度相聯。

DBSCAN聚類

圖1 模拟DBSCAN算法生成的三個簇

  

  在圖1中,設定MinPts=4,圖中藍色的點是核心對象(這些點E鄰域中點的個數大于等于4), 黑色的點是非核心對象,灰色的點是孤立點。在同一個圈(E鄰域)中的點,黑色的點從藍色點直接密度可達。從圖1中可以看出DBSCAN把所有樣本分成了四類,其中三類分别在不同的簇中。每一個簇中藍色的點(核心對象)之間是密度可達的,藍色的點和黑色的點之間是密度相連的。還有一類為異常值(灰色的點),是以DBSCAN不僅可以做聚類分析,還可以做異常值檢測。

2.2 DBSCAN 算法描述

  假設要對樣本集X進行DBSCAN聚類,其實就是把X中密度相連的點的最大集合作為一個簇,直到找出所有的簇即完成了聚類。下面描述具體的步驟:

(1) 檢測樣本集中尚未檢查過的樣本p,如果p未被歸為某個簇或者标記位噪聲(異常值),則檢測其Ε鄰域,若鄰域内包含的樣本數不少于MinPts,則建立新簇C,将鄰域内的所有點加入候選集N;

(2) 對候選集N中所有尚未被處理的樣本q,檢測其E鄰域,若鄰域内包含樣本數不少于MinPts的樣本點,則将這些樣本點加入N。如果q未歸入任何一個簇,則将q加入C;

(3) 重複步驟2,繼續檢測N中未處理的樣本,直到目前候選集N為空;

(4) 重複步驟1~3,直到所有樣本都歸入了某個簇或被标記為噪聲。

3. DBSCAN 優缺點

3.1 優點

(1) 相比于K-Means之類的聚類算法隻适用于凸樣本集,DBSCAN既适用于凸樣本集,也适用于非凸樣本集,并且可以對任意形狀的稠密資料集進行聚類(可參見下文圖2)。

(2) 聚類結果不依賴初始值,結果沒有偏倚。

(3) DBSCAN不僅可以做聚類分析,還可以做異常值檢測,算法對資料集中的異常點不敏感。

3.2 缺點

(1) 對資料要求較高,如果樣本集密度不均勻、聚類間差距較大時,DBSCAN的結果較差,最好在聚類之前對資料進行标準化處理。

(2) 距離門檻值eps(E鄰域的半徑)和鄰域内包含樣本數MinPts參數較難确定,并且對結果影響較大。

(3) 如果樣本集較大時,聚類收斂的時間較長。

執行個體:用DBSCAN對笑臉資料聚類

DBSCAN聚類

圖2 用DBSCAN對笑臉資料進行聚類

  

  動圖素材來源(感興趣的可以去該網址調整一下參數感受DBSCAN的聚類過程):https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/

  

4. DBSCAN 在Python中實作代碼
from sklearn.cluster import DBSCAN   #加載庫
result=DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’, algorithm=’auto’, leaf_size=30, p=None).fit(X)
           

主要參數解析:

eps: E鄰域的距離門檻值,預設值0.5;

min_samples: 樣本點要成為核心對象所需的E鄰域樣本數門檻值,即前文提到的MinPts;

metric: 最近鄰距離度量參數,可選歐式距離、曼哈頓距離、切比雪夫距離、馬氏距離、闵可夫斯基距離、帶權重闵可夫斯基距離等,預設采用歐式距離;

algorithm: 最近鄰搜尋算法參數,算法包括三種——蠻力實作(brute)、KD樹實作(kd_tree)、球樹實作(ball_tree), 如果選擇auto會在上面三種算法中做權衡,選擇一個拟合最優的算法;

leaf_size: 當最近鄰搜尋算法參數為KD樹或球樹時, 設定的值為停止建子樹的葉子節點數量的門檻值,預設值30;

p: 當最近鄰距離度量參數為闵可夫斯基距離和帶權重闵可夫斯基距離時,設定p=1為曼哈頓距離, p=2為歐式距離,采用預設值歐式距離時這個值為None;

  

5. 項目實戰

  背景介紹: 商戶mcc在錄入的時候可能由于錄入人員不小心錄錯,或者商戶故意錯填mcc,以掩蓋自己虛假經營的事實,導緻和實際交易的mcc不符。本文用DBSCAN算法通過分析商戶的交易資料,找出和實際不符的mcc,進而糾正mcc。

step1:加載資料

import pandas as pd 
import numpy as np 
mcc_dm = pd.read_csv('mcc_dm.csv')
           

step2:挑選變量

coulmns_dm = [
'all_avg_tran_amt_30d',
'all_tran_cnt_suc_pct_30d',
'card_tran_cnt_cre_pct_30d',
'all_tran_cnt_m5k_suc_pct_30d',
'tran_cnt_100int_f5_suc_pct_30d',
'ms_deb_card_cnt_pct_30d'
  ]
           

step3: 使用DBSCAN進行聚類并尋找異常樣本點

#标準化處理
from sklearn import preprocessing  
X_dm = mcc_dm[columns_dm]
X_dm_1 = preprocessint.scale(X_dm)
#DBSCAN聚類
from sklearn.cluster import DBSCAN
dm_scale_dbscan = DBSCAN(eps=2, min_samples=10).fit(X_dm_1)  
X_dm['pred_scale_dbscan'] = dm_scale_dbscan.labels_
           

代碼解析:

X_dm: 生成待入模的特征标簽;

X_dm_1: 标準化處理資料,減少樣本集密度不均勻對算法的影響。我在分析的時候發現,如果資料不進行标準化處理,由于實際的資料很可能密度不均勻,導緻DBSCAN的結果很差,最好先處理一下資料再做DBSCAN聚類;

dm_scale_dbscan =: 用處理好的資料訓練模型,eps的值取2,min_samples的值取10,這兩個參數要根據最後結果的分析進行多次調整;

X_dm[‘pred_scale_dbscan’]: 把聚類的标簽放到原始資料中 ,其中-1代表異常值;

  

step4: DBSCAN結果分析

結果:

  -1   16

   0   9832

   1   160

   2   52

   3   23

  最後通過排查發現落在-1這一組的16個商戶中有15個商戶的mcc存在錄入錯誤,需要糾正mcc,驗證了DBSCAN算法在實際應用中的可行性。而且落在1、2、3這些組中的商戶和該mcc大部分的商戶(落在0中)存在差别,可以進一步分析原因,可以先用下面的腳本從資料層面進行分析,如果想進一步确定,可以下發監控營運進行批量排查,找出差别。

  本文是本人使用DBSCAN後的一些見解,如有不當之處懇請指正。如果對文章還有不了解的地方,可以在公衆号中進行咨詢。

  

參考文獻:

  1. https://baike.so.com/doc/3105468-3273248.html
  2. https://www.cnblogs.com/pinard/p/6208966.html

  

猜你感興趣

孤立森林

風控模組化整體流程

用Python繪制皮卡丘

用Python繪制詞雲圖

Python入門幹貨經驗(免費提供資料)

用Python繪制楊紫作品集動态二維碼

  

-end-

DBSCAN聚類

長按(掃一掃)識别上方二維碼學習更多Python和模組化知識