matlab練習程式(DBSCAN)

2022-06-08 20:48:17 字數 2423 閱讀 9303

和kmeans相比,不需要事先知道資料的類數。

以程式設計的角度來考慮,具體演算法流程如下:

1.首先選擇乙個待處理資料。

2.尋找和待處理資料距離在設定半徑內的資料。

3.將找到的半徑內的資料放到乙個佇列中。

4.拿佇列頭資料作為當前待處理資料並不斷執行第2步。

5.直到遍歷完佇列中所有資料,將這些資料記為一類。

6.選擇沒有處理到的資料作為乙個待處理資料執行第2步。

7.直到遍歷完所有資料,演算法結束。

大概就是下圖所示的樣子:

我這裡沒有單獨輸出離群點,不過稍微改進增加離群點個數判斷閾值應該就可以,比較容易修改。

**如下:

clear all;

close all;

clc;

theta=0:0.01:2*pi;

p1=[3*cos(theta) + rand(1,length(theta))/2;3*sin(theta)+ rand(1,length(theta))/2]; %生成測試資料

p2=[2*cos(theta) + rand(1,length(theta))/2;2*sin(theta)+ rand(1,length(theta))/2

];p3=[cos(theta) + rand(1,length(theta))/2;sin(theta)+ rand(1,length(theta))/2

];p=[p1 p2 p3]'

;randindex = randperm(length(p))'

; %打亂資料順序

p=p(randindex,:);

plot(p(:,

1),p(:,2),'.'

)flag = zeros(length(p),1); %聚類標記

clsnum = 0; %類的個數

disnear = 0.3; %聚類半徑

for i=1

:length(p)

nxtp = p(i,:); %初始聚類半徑內的鄰域點佇列

if flag(i)==0

clsnum = clsnum+1

; pcstart = 1; %設定佇列起始指標

preflag = flag; %聚類標記更新

while pcstart<=length(nxtp) %判斷是否完成佇列遍歷

curp = nxtp(pcstart,:); %得到當前要處理的點

pcstart = pcstart+1; %佇列指標更新

diffp = p-curp; %這裡直接和所有資料比較了,資料量大的時候可以考慮kdtree

dis = sqrt(diffp(:,1).*diffp(:,1)+diffp(:,2).*diffp(:,2)); %判斷當前點與所有點之間的距離

ind = dis得到距離小於閾值的索引

flag(ind) = clsnum; %設定當前聚類標記

diff_flag = preflag-flag;

diff_ind = (preflag-flag)<0; %判斷本次迴圈相比上次迴圈增加的點

tmp = zeros(length(p),1

); tmp(diff_ind) =clsnum;

flag = flag + tmp; %增加的點將其標記為一類

preflag = flag; %聚類標記更新

nxtp = [nxtp;p(diff_ind,:)]; %增加聚類半徑內的鄰域點佇列

endend

end%聚類可能不止三組,我偷懶不想判斷並plot了

figure;

plot(p(flag==1,1),p(flag==1,2),'r.'

) hold on;

plot(p(flag==2,1),p(flag==2,2),'g.'

)

plot(p(flag==3,1),p(flag==3,2),'

b.')

結果如下:

原始資料:

聚類結果:

matlab練習程式(c c 呼叫matlab)

就我目前了解的c 呼叫matlab有兩種方法。第一種是通過matlab引擎呼叫,也就是這裡用到的方法。第二種是用matlab將m檔案編譯為相應的h lib dll檔案再加以呼叫。使用engine所用到的h和lib檔案基本在d program files matlab r2010b extern裡面,...

matlab練習程式(SUSAN檢測)

susan運算元既可以檢測角點也可以檢測邊緣,不過角點似乎比不過harris,邊緣似乎比不過canny。不過思想還是有點意思的。主要思想就是 首先做乙個和原影象等大的目標影象。然後用乙個圓形的模板,用模板去遍歷原影象每個畫素,把模板內的每個畫素都和模板中心畫素比較,如果灰度小於乙個閾值,那麼就對目標...

matlab練習程式(GPU加速)

在matlab中使用gpu,要先輸入gpudevice命令初始化一下裝置。根據返回的資訊能夠大概估算出視訊記憶體支援的最大資料。否則使用時容易出現下面這樣的問題 錯誤使用 gpuarray an unexpected error occurred during cuda execution.the ...