
西电数据挖掘大作业-密度聚类DBSCAN.docx
7页题 目: 数据挖掘实验报告 学 院: 电子工程学院 专 业: 智能科学与技术 学生姓名: ** 学 号: 02115*** 数据挖掘实验报告——密度聚类 DBSCAN一、 问题介绍用 DBSCAN 的方法对双层正方形数据和三维同心球数据进行聚类其中样本个数为 20000,且为均匀分布二、 算法描述输入: espilong— 半径MinPts — 给定点在 espilong 邻域内成为核心对象的最小领域点数data — 集合输出:目标类簇集合;聚类数方法:1) 标记所有对象为 unvisited;2) do3) 随机选择一个 unvisited 对象 p;4) 标记 p 为 visited;5) if p 的 espilong 邻域至少有 MinPts 个对象6) 创建一个新簇 C7) 令 N 为 p 的 espilong 邻域中的对象的集合8) for N 中的每个点 p’9) if p’是 unvisited10) 标记 p’为 visited11) if p’的 espilong 邻域至少有 MinPts 个对象12) 把这些对象添加到 N 中13) if p’还不是任何簇的成员14) 把 p’添加到 c15) end for16) else17) 标记 p 为噪声18) until 没有标记为 unvisited 的对象三、 实验结果由于考虑到内存问题,所以这里只取 2000 个数据1、 双层正方形数据由多次实验可知 epsilong=10 MinPts=202、 三维同心球数据由多次实验可知 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:numfor j=1:num dis(i,j)=norm(data(i,:)-data(j,:)); endendwhile(min(visited(:,1))==0) %随机选择一个未访问过的对象pwhile(1) p=round(num*rand);if(p==0)p=1;endif(visited(p,1)==0)break;endend%标记p为visitedvisited(p,1)=1;%判断p的epsilong 邻域内对象的个数[row col]=find(dis(p,:)1)pp=N(1,2);if(visited(pp,1)==0)visited(pp,1)=1;[prow pcol]=find(dis(pp,:)=MinPts)N=cat(2,N,pcol);endendif((visited(pp,2)==0)||(visited(pp,2)==-1))visited(pp,2)=c;endv=size(N,2);N=N(:,2:v); end %簇c生成c=c+1; end endy=visited(:,2);c=c-1;end creatdata_squareclear;clc;%数据生成num=2000;data=zeros(num,2);for i=1:num/2data(i,1)=-50+100*rand;data(i,2)=-50+100*rand; endwhile(i~=num)x=-100+200*rand; y=-100+200*rand;if(x>=-50&&x=-50&&y<=50)i=i;elsei=i+1;data(i,1)=x;data(i,2)=y;endend%利用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:numif(y(i,1)~=-1)plot(data(i,1),data(i,2),linetype{y(i,1)});elseplot(data(i,1),data(i,2),linetype{c+1});endhold on;endaxis([-100 100 -100 100]); creatdata_circleclear;clc;%数据生成num=2000;data=zeros(num,3);for i=1:num/2rho=50*rand;theta=2*pi*rand;phi=pi*rand;data(i,1)=rho*sin(phi)*cos(theta);data(i,2)=rho*sin(phi)*sin(theta);data(i,3)=rho*cos(phi); endfor j=1:num/2i=j+num/2;rho=50+50*rand;theta=2*pi*rand;phi=pi*rand;data(i,1)=rho*sin(phi)*cos(theta);data(i,2)=rho*sin(phi)*sin(theta);data(i,3)=rho*cos(phi); end%利用DBSCAN进行分类epsilong=5;MinPts=7;[y c]=DBSCAN(data,epsilong,MinPts);%½á¹ûÏÔʾdisp(sprintf('聚类数为%d',c));linetype={'r*','b*','g*','k*','c*','y*','r<','k<','b<','g<','y<','c<'};for i=1:numif(y(i,1)~=-1)plot3(data(i,1),data(i,2),data(i,3),linetype{y(i,1)});elseplot3(data(i,1),data(i,2),data(i,3),linetype{c+1});endhold on;endgrid on;axis([-100 100 -100 100]);。
