基於密度定義,我們將點分爲:
- 稠密區域內部的點(核心點)
- 稠密區域邊緣上的點(邊界點)
- 稀疏區域中的點(噪聲或背景點).
DBSCAN算法的本質就是隨大流,邊界點緊緊圍繞着核心點,他們抱團,不帶噪點玩兒
小團體多了,聯繫比較密切的小團體之間聚成了同個類
比較偏遠的小團體想要加入這個圈子,進不去,就單幹,我們自己玩自己的,聚成了另外的一個類
一開始就被孤立的噪點吧,自然有自己的傲骨,接着孤芳自賞
算法原理
DBSCAN通過檢查數據集中每點的Eps鄰域來搜索簇,如果點p的Eps鄰域包含的點多於MinPts個,則創建一個以p爲核心對象的簇。
然後,DBSCAN迭代地聚集從這些核心對象直接密度可達的對象,這個過程可能涉及一些密度可達簇的合併。
當沒有新的點添加到任何簇時,該過程結束.
僞代碼
DBSCAN(D, eps, MinPts) {
C = 0
for each point P in dataset D {
if P is visited
continue next point
mark P as visited
NeighborPts = regionQuery(P, eps)
if sizeof(NeighborPts) < MinPts
mark P as NOISE
else {
C = next cluster
expandCluster(P, NeighborPts, C, eps, MinPts)
}
}
}
expandCluster(P, NeighborPts, C, eps, MinPts) {
add P to cluster C
for each point P' in NeighborPts {
if P' is not visited {
mark P' as visited
NeighborPts' = regionQuery(P', eps)
if sizeof(NeighborPts') >= MinPts
NeighborPts = NeighborPts joined with NeighborPts'
}
if P' is not yet member of any cluster
add P' to cluster C
}
}
regionQuery(P, eps)
return all points within P's eps-neighborhood (including P)
複雜度
時間複雜度
DBSCAN的基本時間複雜度是 O(N*找出Eps領域中的點所需要的時間), N是點的個數。最壞情況下時間複雜度是O(N2)
在低維空間數據中,有一些數據結構如KD樹,使得可以有效的檢索特定點給定距離內的所有點,時間複雜度可以降低到O(NlogN)
空間複雜度
低維或高維數據中,其空間都是O(N),對於每個點它只需要維持少量數據,即簇標號和每個點的標識(核心點或邊界點或噪音點)
特點
優點
基於密度定義,相對抗噪音,能處理任意形狀和大小的簇
缺點
對輸入參數敏感
當簇的密度變化太大時,會有麻煩
對於高維問題,密度定義是個比較麻煩的問題
實例
解答過程