基于密度的聚类算法DBSCAN

%% DBSCANclear all;clc;%% 导入数据集% data = load('testData.txt');data = load('testData_2.txt');% 定义参数Eps和MinPtsMinPts = 5;Eps = epsilon(data, MinPts);[m,n] = size(data);%得到数据的大小x = [(1:m)' data];[m,n] = size(x);%重新计算数据集的大小types = zeros(1,m);%用于区分核心点1,,边界点0和噪音点-1dealed = zeros(m,1);%用于判断该点是否处理过,0表示未处理过dis = calDistance(x(:,2:n));number = 1;%用于标记类%% 对每一个点进行处理for i = 1:m%找到未处理的点if dealed(i) == 0xTemp = x(i,:);D = dis(i,:);%取得第i个点到其他所有点的距离ind = find(D<=Eps);%找到半径Eps内的所有点%% 区分点的类型%边界点if length(ind) > 1 && length(ind) < MinPts+1types(i) = 0;class(i) = 0;end%噪音点if length(ind) == 1types(i) = -1;class(i) = -1;dealed(i) = 1;end%核心点(此处是关键步骤)if length(ind) >= MinPts+1types(xTemp(1,1)) = 1;class(ind) = number;% 判断核心点是否密度可达while ~isempty(ind)yTemp = x(ind(1),:);dealed(ind(1)) = 1;ind(1) = [];D = dis(yTemp(1,1),:);%找到与ind(1)之间的距离ind_1 = find(D<=Eps);if length(ind_1)>1%处理非噪音点class(ind_1) = number;if length(ind_1) >= MinPts+1types(yTemp(1,1)) = 1;elsetypes(yTemp(1,1)) = 0;endfor j=1:length(ind_1)if dealed(ind_1(j)) == 0dealed(ind_1(j)) = 1;ind=[ind ind_1(j)];class(ind_1(j))=number;endendendendnumber = number + 1;endendend% 最后处理所有未分类的点为噪音点ind_2 = find(class==0);class(ind_2) = -1;types(ind_2) = -1;%% 画出最终的聚类图hold onfor i = 1:mif class(i) == -1plot(data(i,1),data(i,2),'.r');elseif class(i) == 1if types(i) == 1plot(data(i,1),data(i,2),'+b');elseplot(data(i,1),data(i,2),'.b');endelseif class(i) == 2if types(i) == 1plot(data(i,1),data(i,2),'+g');elseplot(data(i,1),data(i,2),'.g');endelseif class(i) == 3if types(i) == 1plot(data(i,1),data(i,2),'+c');elseplot(data(i,1),data(i,2),'.c');endelseif types(i) == 1plot(data(i,1),data(i,2),'+k');elseplot(data(i,1),data(i,2),'.k');endendendhold off

距离计算函数

%% 计算矩阵中点与点之间的距离function [ dis ] = calDistance( x )[m,n] = size(x);dis = zeros(m,m);for i = 1:mfor j = i:m%计算点i和点j之间的欧式距离tmp =0;for k = 1:ntmp = tmp+(x(i,k)-x(j,k)).^2;enddis(i,j) = sqrt(tmp);dis(j,i) = dis(i,j);endendendepsilon函数

function [Eps]=epsilon(x,k)% Function: [Eps]=epsilon(x,k)%% Aim: % Analytical way of estimating neighborhood radius for DBSCAN%% Input: % x – data matrix (m,n); m-objects, n-variables% k – number of objects in a neighborhood of an object% (minimal number of objects considered as a cluster)[m,n]=size(x);Eps=((prod(max(x)-min(x))*k*gamma(.5*n+1))/(m*sqrt(pi.^n))).^(1/n);

最终的结果

人爱美,不仅需要服饰居室之美,还需要心灵品德之美。

基于密度的聚类算法DBSCAN

相关文章:

你感兴趣的文章:

标签云: