寫給自己看的DBSCAN 1 基本實現

2021-10-23 08:22:46 字數 2045 閱讀 8053

參考:西瓜書

dbscan的思想是基於密度來聚類,十分直觀易懂,更嚴謹的描述可見西瓜書,其中個人認為最關鍵的是:

若x

xx為核心物件,由x

xx密度可達的所有樣本組成的集合記為x

=x=\

x=,則不難證明x

xx即為滿足連線性與最大性的簇。

這就指明了實現的一種思路:先找到所有的核心物件,再找到這些核心物件密度可達的其他點。

偽**如下:

這裡給出c++的實現,基本上忠於上述的偽**,沒有對效能進行優化:

struct clusterdata

;/*********

dbscan_cpp

parameters:

cluster: an array contains all points, points' clusterindex and datatype are initiated as 0

totalpts: number of points in cluster

return: number of clusters

*********/

intdbscan_cpp

(clusterdata *cluster,

const

int totalpts,

const

double eps,

const

unsigned

int minpts)

if(neighbors[j]

.size()

>= minpts)

coreobj.

push_back

(j);

} set<

int> unvisitedpts;

for(

int i =

0; i < totalpts; i++

) unvisitedpts.

insert

(i);

int k =1;

//the index of first cluster is 1, not 0

vector

int>> c;

while

(coreobj.

size()

>0)

else

cluster[q]

.datatype =1;

} k = k +1;

set<

int> c;

set_difference

(unvisitedptsold.

begin()

, unvisitedptsold.

end(

), unvisitedpts.

begin()

, unvisitedpts.

end(),

inserter

(c, c.

begin()

)); c.

push_back

(c);

set<

int> diff;

sort

(coreobj.

begin()

, coreobj.

end())

;set_difference

(coreobj.

begin()

, coreobj.

end(

), c.

begin()

, c.

end(),

inserter

(diff, diff.

begin()

)); coreobj.

assign

(diff.

begin()

, diff.

end())

;}return k-1;

}

這裡還有乙份matlab的實現可供參考。

寫給自己看的

我不常寫日誌,不過最近各種事情,還是有點需要記錄下來。今天下午上資料庫的時候,本來以為被鄙視了的 筆試居然發來恭喜通過的通知,說是等待面試,出乎意料的同時也感嘆rp又用掉了很多 最近的rp消耗確實有點失常,painterbee在mm上的表現就不說了,在校賽上也拿到了之前沒拿過的高名次,雖然是題目的區...

寫給自己看的(一)

第一次寫部落格,琢磨了好久不知道該寫些什麼,後來想了想,就當學習筆記了嘛,反正也沒人看 正好今天在看雙越老師的設計模式的時候講到了 模式,於是就順勢查了查es6中proxy的語法,看了看阮一峰老師的書,感覺又開啟了新世界的大門。先說說什麼是proxy吧。proxy英文的意思是 用阮老師的話說,就是p...

寫給自己看的Promise

static pending pending 準備狀態 static fulfilled fulfilled 解決狀態 static rejected rejected 拒絕狀態 1.初始化狀態 值 then中沒 有處理的函式陣列 2.將resolve和reject函式傳遞 出去 construct...