西电数据挖掘大作业-密度聚类DBSCAN

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目:数据挖掘实验报告学院:电子工程学院

专业:智能科学与技术学生姓名:**

学号:02115***

数据挖掘实验报告

——密度聚类DBSCAN 一、问题介绍

用DBSCAN的方法对双层正方形数据和三维同心球数据进行聚类。

其中样本个数为20000,且为均匀分布。

二、算法描述

输入:espilong—半径

MinPts—给定点在espilong邻域内成为核心对象的最小领域点数data —集合

输出:目标类簇集合;聚类数

方法:

1)标记所有对象为unvisited;

2)do

3)随机选择一个unvisited对象p;

4)标记p为visited;

5) if p的espilong邻域至少有MinPts个对象

6)创建一个新簇C

7)令N为p的espilong邻域中的对象的集合

8) for N中的每个点p’

9) if p’是unvisited

10) 标记p’为visited

11) if p’的espilong邻域至少有MinPts个对象

12) 把这些对象添加到N中

13) if p’还不是任何簇的成员

14) 把p’添加到c

15) end for

16) else

17) 标记p为噪声

18)until 没有标记为unvisited的对象

三、实验结果

由于考虑到内存问题,所以这里只取2000个数据

1、双层正方形数据

由多次实验可知epsilong=10 MinPts=20

2、三维同心球数据

由多次实验可知epsilong=5 MinPts=7

四、实验代码

DBSCAN

%%%%%%%%%%DBSCAN%%%%%%

%输入:

% data——包含n个对象的数据集

% epsilon——半径参数

% MinPts——邻域密度阈值

%输出:

% y——基于密度的簇的分类

% c——类别数

function [y c]=DBSCAN(data,epsilong,MinPts) num=size(data,1);

N=zeros(1,1);

c=1;

visited=zeros(num,2);

dis=zeros(num,num);

for i=1:num

for j=1:num

dis(i,j)=norm(data(i,:)-data(j,:));

end

end

while(min(visited(:,1))==0)

%随机选择一个未访问过的对象p

while(1)

p=round(num*rand);

if(p==0)

p=1;

end

if(visited(p,1)==0)

break;

end

end

%标记p为visited

visited(p,1)=1;

%判断p的epsilong邻域内对象的个数

[row col]=find(dis(p,:)<=epsilong);

n=size(col,2);

if(n

visited(p,2)=-1;%标记为噪声

else

visited(p,2)=c;%为p创建一个新的簇c

N=cat(2,N,col);%将p的epsilong邻域内的所有对象放到候选集合N中%迭代的将N中不属于其它簇的对象添加到c中

while(size(N,2)>1)

pp=N(1,2);

if(visited(pp,1)==0)

visited(pp,1)=1;

[prow pcol]=find(dis(pp,:)<=epsilong);

nn=size(pcol,2);

if(nn>=MinPts)

N=cat(2,N,pcol);

end

end

if((visited(pp,2)==0)||(visited(pp,2)==-1))

visited(pp,2)=c;

end

v=size(N,2);

N=N(:,2:v);

end

%簇c生成

c=c+1;

end

end

y=visited(:,2);

c=c-1;

end

creatdata_square

clear;clc;

%数据生成

num=2000;

data=zeros(num,2);

for i=1:num/2

data(i,1)=-50+100*rand;

data(i,2)=-50+100*rand;

end

while(i~=num)

x=-100+200*rand;

y=-100+200*rand;

if(x>=-50&&x<=50&&y>=-50&&y<=50)

i=i;

else

i=i+1;

data(i,1)=x;

data(i,2)=y;

end

end

%利用DBSCAN进行聚类

epsilong=10;

MinPts=20;

[y c]=DBSCAN(data,epsilong,MinPts);

%结果显示

disp(sprintf('聚类数为%d',c));

linetype={'r*','b*','g*','k*','y*','c*','r<','k<','b<','g<','y<','c<' };

for i=1:num

if(y(i,1)~=-1)

plot(data(i,1),data(i,2),linetype{y(i,1)});

else

plot(data(i,1),data(i,2),linetype{c+1});

end

hold on;

end

axis([-100 100 -100 100]);

相关文档
最新文档