聚類算法-DBSCAN
Density-Based Spatial Clustering of Applications with Noise
基本概念:
- 核心對象:若某個點的密度達到算法設定的閾值則其爲核心點。
- 相當於在r的鄰域內點的數量不小於我們設定的閾值
- ϵ-鄰域的距離閾值是我們設定的半徑r
- 直接密度可達:若某點p在點q的 r 鄰域內,且q是核心點則p-q直接密度可達。
- 密度可達:若有一個點的序列q0、q1、…qk,對任意qi~qi-1是直接密度可達的 ,則稱從q0到qk密度可達,這實際上是直接密度可達的“傳播”。
- 密度相連:若從某核心點p出發,點q和點k都是密度可達的 ,則稱點q和點k是密度相連的。
- 邊界點:屬於某一個類的非核心點,不能發展下線了
- 噪聲點:不屬於任何一個類簇的點,從任何一個核心點出發都是密度不可達的
- 相當於某個點距離有點遠,可以理解成是沒有用的干擾點
- 相當於某個點距離有點遠,可以理解成是沒有用的干擾點
- 上圖中,點的分類分別是:
- A——核心對象
- B,C——邊界點:因爲這兩個點不能再發展下線了
- N——離羣點:因爲這個點所代表的這一片區域再也找不到其他點了,離羣了
工作流程:
所需參數
- 參數D:所需數據集
- 參數ϵ:指定的半徑
- MinPts:密度閾值
詳細流程
for(數據集D中每個對象p) do
if (p已經歸入某個簇或標記爲噪聲) then
continue;
else
檢查對象p的Eps鄰域 NEps(p) ;
if (NEps(p)包含的對象數小於MinPts) then
標記對象p爲邊界點或噪聲點;
else
標記對象p爲核心點,並建立新簇C, 並將p鄰域內所有點加入C
for (NEps(p)中所有尚未被處理的對象q) do
檢查其Eps鄰域NEps(q),若NEps(q)包含至少MinPts個對象,則將NEps(q)中未歸入任何一個簇的對象加入C;
end for
end if
end if
end for
來自:https://blog.csdn.net/zhouxianen1987/article/details/68945844
參數的選擇:
- 半徑ϵ:可以根據K距離來設定:找突變點 K距離:給定數據集P={p(i); i=0,1,…n},計算點P(i)到集合D的子集S中所有點 之間的距離,距離按照從小到大的順序排序,d(k)就被稱爲k-距離
- MinPts:k-距離中k的值,一般取的小一些,多次嘗試
總而言之,上面的都要多次嘗試
優勢劣勢
優勢
- 不需要指定簇的個數,算法會分配好的
- 可以發現任意形狀的簇,這是比K-MEANS強大很多的地方
- 擅長找到離羣點,算法會檢測出來的
- 我們提供兩個參數就夠了,不用過度費腦
劣勢:
- 高維度的數據處理還是有些困難
- 參數難以選擇(參數對結果影響很大)
- 在sklearn中運行效率比較慢(可以採用數據削減策略)
推薦一個可視化展示的一個網站,這個網站演示了DBSCAN算法的一個工作流程
- https://www.naftaliharris.com/blog/visualizing-dbscan-clustering/
- 選擇一個類型,我們試試Pimpled Smiley
- 選擇不同的半徑和最少點數,再點擊start就能看見完整的運行流程了
我們要多多嘗試不同的半徑和不同的minpoints,仔細研究這兩個因素對分類結果的影響
對唐宇迪老師的機器學習教程進行筆記整理
編輯日期:2018-10-12
小白一枚,請大家多多指教