參考:西瓜書
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...