DBSCAN 集群

目录

DBSCAN 集群

主要代码

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) ')']);

DBSCAN 集群_第1张图片


DBSCAN


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

你可能感兴趣的:(数学建模)