目录
DBSCAN 集群
主要代码
DBSCAN
绘制结果中的集群
基于密度的空间聚类应用(DBSCAN)是一种基于密度的聚类算法,由Martin Ester等人在1996年提出。该算法在半径为ε的圆内找到数据点的相邻点,并将它们加入到同一个聚类中。对于任何一个相邻点,如果它的ε-相邻点包含预定数量的点,聚类就会被扩展到包含其相邻点。然而,对于未分配的点,如果邻域中的点的数量少于预定的阈值,则该点被认为是一个噪音。因此,DBSCAN也可以区分正常数据和噪声数据。
num2str - 将数字转换为字符数组
此 MATLAB 函数 将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量级。num2str 对使用数值为绘图添加标签和标题非常有用。
clc;
clear;
close all;
%% Load Data
data=load('mydata');
X=data.X;
%% Run DBSCAN Clustering Algorithm
epsilon=0.5;
MinPts=10;
IDX=DBSCAN(X,epsilon,MinPts);
%% Plot Results
PlotClusterinResult(X, IDX);
title(['DBSCAN Clustering (\epsilon = ' num2str(epsilon) ', MinPts = ' num2str(MinPts) ')']);
pdist2 两组观测值之间的配对距离
D = pdist2(X,Y,Distance) 返回X和Y中每一对观察值之间的距离,使用Distance指定的度量。
D = pdist2(X,Y,Distance,DistParameter) 返回使用Distance和DistParameter指定的度量的距离。只有当Distance是'seuclidean'、'minkowski'或'mahalanobis'时,你才能指定DistParameter。
D = pdist2(___,Name,Value)指定了一个额外的选项,除了前面语法中的任何参数外,还使用了一个名-值对参数'Smallest'或'Largest'。
false
是逻辑值0
的速记形式。
F = false(n)
是一个由逻辑值“0”组成的n
×n
数组。
F = false(sz)
是一个由逻辑值“0”组成的数组,其中大小向量sz
定义size(F)
。例如,false([2 3])
返回由逻辑值“0”组成的 2×3 数组。
F = false(sz1,...,szN)
是由逻辑值“0”组成的sz1
×...
×szN
数组,其中sz1,...,szN
表示每个维度的大小。例如,false(2,3)
返回由逻辑值“0”组成的 2×3 数组。
F = false(___,'like',p)
使用任何以前的大小语法返回稀疏度与逻辑变量p
相同的、由逻辑值“0”构成的数组。
size 当
dim
为正整数标量时,szdim = size(A,dim)
返回维度dim
的长度。从 R2019b 开始,您还可以将dim
指定为正整数向量,以一次查询多个维度长度。例如,size(A,[2 3])
以 1×2 行向量szdim
形式返回A
的第二个维度和第三个维度的长度。
zeros X = zeros(sz1,...,szN)
返回由零组成的sz1
×...×szN
数组,其中sz1,...,szN
指示每个维度的大小。例如,zeros(2,3)
将返回一个 2×3 矩阵。
numel n = numel(A)
返回数组A
中的元素数目n
等同于prod(size(A))
。break - 终止执行 for 或 while 循环
此 MATLAB 函数 终止执行 for 或 while 循环。不执行循环中在 break 语句之后显示的语句。
function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)
C=0;
n=size(X,1);
IDX=zeros(n,1);
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
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
hsv
c = hsv
以三列数组形式返回 hsv 颜色图,其中包含的行数与当前图窗的颜色图相同。如果不存在图窗,则行数等于默认长度 256。数组中的每一行包含一种特定颜色的红、绿、蓝强度。强度介于 [0,1] 范围内,颜色方案如下图所示。
c = hsv(m)
返回包含m
种颜色的颜色图。
{}
大括号,用于cell型的数组(就是前面讲的单元数组)的分配或引用。
比如 a{3,3}=‘china’就是建立了一个3*3的单元数组,a(3,3)就是‘china’
%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPML110
% Project Title: Implementation of DBSCAN Clustering in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: [email protected], [email protected]
%
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