? ? 聲明:本文修改自《數(shù)學(xué)建模清風(fēng)》老師的代碼
???DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一個(gè)比較有代表性的基于密度的聚類算法。與劃分和層次聚類方法不同,它將簇定義為密度相連的點(diǎn)的最大集合,能夠把具有足夠高密度的區(qū)域劃分為簇,并可在噪聲的空間數(shù)據(jù)庫中發(fā)現(xiàn)任意形狀的聚類。?
? ? ? ? 作為經(jīng)典的聚類算法,DBSCAN聚類在數(shù)學(xué)建模競賽中用到的概率很大。本文不詳細(xì)展開講解DBSCAN的原理,只介紹相關(guān)代碼的使用步驟。
DBSCAN函數(shù)代碼:
function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
C=0;
n=size(X,1);
IDX=zeros(n,1); % 初始化全部為0,即全部為噪音點(diǎn)
D=pdist2(X,X);
visited=false(n,1);
isnoise=false(n,1);
for i=1:n
if ~visited(i)
visited(i)=true;
Neighbors=RegionQuery(i);
if numel(Neighbors)<MinPts
% X(i,:) is NOISE
isnoise(i)=true;
else
C=C+1;
ExpandCluster(i,Neighbors,C);
end
end
end
function ExpandCluster(i,Neighbors,C)
IDX(i)=C;
k = 1;
while true
j = Neighbors(k);
if ~visited(j)
visited(j)=true;
Neighbors2=RegionQuery(j);
if numel(Neighbors2)>=MinPts
Neighbors=[Neighbors Neighbors2]; %#ok
end
end
if IDX(j)==0
IDX(j)=C;
end
k = k + 1;
if k > numel(Neighbors)
break;
end
end
end
function Neighbors=RegionQuery(i)
Neighbors=find(D(i,:)<=epsilon);
end
end
繪制聚類圖的代碼:
?
function PlotClusterinResult(X, IDX)
k=max(IDX);
Colors=hsv(k);
Legends = {};
for i=0:k
Xi=X(IDX==i,:);
if i~=0
Style = 'x';
MarkerSize = 8;
Color = Colors(i,:);
Legends{end+1} = ['Cluster #' num2str(i)];
else
Style = 'o';
MarkerSize = 6;
Color = [0 0 0];
if ~isempty(Xi)
Legends{end+1} = 'Noise';
end
end
if ~isempty(Xi)
plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color);
end
hold on;
end
hold off;
axis equal;
grid on;
legend(Legends);
legend('Location', 'NorthEastOutside');
end
接下來是主函數(shù):
clc;
clear;
close all;
load mydata;
%%注意,此處Data.mat用于導(dǎo)入自己的數(shù)據(jù),數(shù)據(jù)名字要用X,或者在下方改變量名也可以
if size(X,2)==2
%%如果列數(shù)=2才可以運(yùn)算
epsilon=0.5;
%%規(guī)定聚類半徑
MinPts=10;
%%規(guī)定半徑內(nèi)最小數(shù)目點(diǎn)
%%上面兩個(gè)參數(shù)對聚類的結(jié)果很敏感,可以多次修改得出最好的結(jié)果
IDX=DBSCAN(X,epsilon,MinPts);
%%調(diào)用DBSCAN函數(shù),輸入?yún)?shù)有三個(gè),分別是原始數(shù)據(jù),聚類半徑,最小數(shù)目點(diǎn)
%%IDX用于保存每一項(xiàng)數(shù)據(jù)所屬的聚類類別數(shù)目
PlotClusterinResult(X, IDX);
%%畫出聚類結(jié)果圖
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
else
disp("請修改數(shù)據(jù),DBCASN對二維聚類最佳!")
end
如下是聚類結(jié)果:
?使用要點(diǎn):文章來源:http://www.zghlxwxcb.cn/news/detail-504806.html
????????前兩個(gè)函數(shù)分別保存為獨(dú)立的m文件,將其與主函數(shù)放置同一文件夾目錄之下即可。此外,自己的數(shù)據(jù)要獨(dú)立保存為.mat文件,也在同一目錄之下。最后直接運(yùn)行main函數(shù)即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-504806.html
到了這里,關(guān)于DBSCAN聚類算法——MATLAB實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!