一、基本原理
基于密度的聚类方法,聚类前不需要预先指定聚类的个数,生成的簇的个数基于给定数据。优点:能发现任意形状的簇,同时过滤噪声信号。
三种数据
核心点:在半径Eps内含有不少于MinPts数目的点
边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的领域内
噪音点:既不是核心点也不是边界点的点
二、代码(来自matlab源码)
%% 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: sm.kalami@gmail.com, info@yarpiz.com%function [IDX, isnoise]=DBSCAN(X,epsilon,MinPts)%epsilon表示点的半径,MinPts表示关键点半径内所需包含的最小点数C=0;n=size(X,1); % n代表点的数量IDX=zeros(n,1); % IDX存储了所有元素的分类,初始化全部为0,即全部为噪音点D=pdist2(X,X); % 计算两点之间的距离visited=false(n,1); %初始化isnoise=false(n,1);for i=1:nif ~visited(i)visited(i)=true;Neighbors=RegionQuery(i);% 找到半径内所包含的点if numel(Neighbors)<MinPts % 标记噪音点% X(i,:) is NOISEisnoise(i)=true;elseC=C+1;ExpandCluster(i,Neighbors,C);endendendfunction ExpandCluster(i,Neighbors,C) % 找到同一类的点并打标IDX(i)=C;k = 1;while truej = Neighbors(k);if ~visited(j)visited(j)=true;Neighbors2=RegionQuery(j);if numel(Neighbors2)>=MinPtsNeighbors=[Neighbors Neighbors2]; %#okendendif IDX(j)==0IDX(j)=C;endk = k + 1;if k > numel(Neighbors)break;endendendfunction Neighbors=RegionQuery(i)Neighbors=find(D(i,:)<=epsilon);endend
