密度峰值聚类算法MATLAB程序
凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC)
数据见:MATLAB中“fitgmdist”的用法及其GMM聚类算法,保存为gauss_data.txt文件,数据最后一列是类标签。
1. MATLAB程序
clear all close all data_load=dlmread('gauss_data.txt'); [num,dim]=size(data_load); %数据最后一列是类标签 data=data_load(:,1:dim-1); %去掉标签的数据 mdist=pdist(data); %两两行之间距离 A=tril(ones(num))-eye(num); [x,y]=find(A~=0); % Column 1: id of element i, Column 2: id of element j', Column 3: dist(i,j)' xx=[x y mdist']; ND=max(xx(:,2)); NL=max(xx(:,1)); if (NL>ND) ND=NL; end N=size(xx,1); for i=1:ND for j=1:ND dist(i,j)=0; end end for i=1:N ii=xx(i,1); jj=xx(i,2); dist(ii,jj)=xx(i,3); dist(jj,ii)=xx(i,3); end percent=2.0; fprintf('average percentage of neighbours (hard coded): %5.6f\n', percent); position=round(N*percent/100); sda=sort(xx(:,3)); dc=sda(position); fprintf('Computing Rho with gaussian kernel of radius: %12.6f\n', dc); for i=1:ND rho(i)=0.; end % % Gaussian kernel % for i=1:ND-1 for j=i+1:ND rho(i)=rho(i)+exp(-(dist(i,j)/dc)*(dist(i,j)/dc)); rho(j)=rho(j)+exp(-(dist(i,j)/dc)*(dist(i,j)/dc)); end end % % "Cut off" kernel % %for i=1:ND-1 % for j=i+1:ND % if (dist(i,j)<dc) % rho(i)=rho(i)+1.; % rho(j)=rho(j)+1.; % end % end %end maxd=max(max(dist)); [rho_sorted,ordrho]=sort(rho,'descend'); delta(ordrho(1))=-1.; nneigh(ordrho(1))=0; for ii=2:ND delta(ordrho(ii))=maxd; for jj=1:ii-1 if(dist(ordrho(ii),ordrho(jj))<delta(ordrho(ii))) delta(ordrho(ii))=dist(ordrho(ii),ordrho(jj)); nneigh(ordrho(ii))=ordrho(jj); end end end delta(ordrho(1))=max(delta(:)); disp('Generated file:DECISION GRAPH') disp('column 1:Density') disp('column 2:Delta') fid = fopen('DECISION_GRAPH', 'w'); for i=1:ND fprintf(fid, '%6.2f %6.2f\n', rho(i),delta(i)); end disp('Select a rectangle enclosing cluster centers') scrsz = get(0,'ScreenSize'); figure('Position',[6 72 scrsz(3)/4. scrsz(4)/1.3]); for i=1:ND ind(i)=i; gamma(i)=rho(i)*delta(i); end subplot(2,1,1) tt=plot(rho(:),delta(:),'o','MarkerSize',5,'MarkerFaceColor','k','MarkerEdgeColor','k'); title ('Decision Graph','FontSize',15.0) xlabel ('\rho') ylabel ('\delta') fig=subplot(2,1,1); rect = getrect(fig); rhomin=rect(1); deltamin=rect(2); NCLUST=0; for i=1:ND cl(i)=-1; end for i=1:ND if ( (rho(i)>rhomin) && (delta(i)>deltamin)) NCLUST=NCLUST+1; cl(i)=NCLUST; icl(NCLUST)=i; end end fprintf('NUMBER OF CLUSTERS: %i \n', NCLUST); disp('Performing assignation') %assignation for i=1:ND if (cl(ordrho(i))==-1) cl(ordrho(i))=cl(nneigh(ordrho(i))); end end %halo for i=1:ND halo(i)=cl(i); end if (NCLUST>1) for i=1:NCLUST bord_rho(i)=0.; end for i=1:ND-1 for j=i+1:ND if ((cl(i)~=cl(j))&& (dist(i,j)<=dc)) rho_aver=(rho(i)+rho(j))/2.; if (rho_aver>bord_rho(cl(i))) bord_rho(cl(i))=rho_aver; end if (rho_aver>bord_rho(cl(j))) bord_rho(cl(j))=rho_aver; end end end end for i=1:ND if (rho(i)<bord_rho(cl(i))) halo(i)=0; end end end for i=1:NCLUST nc=0; nh=0; for j=1:ND if (cl(j)==i) nc=nc+1; end if (halo(j)==i) nh=nh+1; end end fprintf('CLUSTER: %i CENTER: %i ELEMENTS: %i CORE: %i HALO: %i \n', i,icl(i),nc,nh,nc-nh); end cmap=colormap; for i=1:NCLUST ic=int8((i*64.)/(NCLUST*1.)); subplot(2,1,1) hold on plot(rho(icl(i)),delta(icl(i)),'o','MarkerSize',8,'MarkerFaceColor',cmap(ic,:),'MarkerEdgeColor',cmap(ic,:)); end subplot(2,1,2) disp('Performing 2D nonclassical multidimensional scaling') Y1 = mdscale(dist, 2, 'criterion','metricstress'); plot(Y1(:,1),Y1(:,2),'o','MarkerSize',2,'MarkerFaceColor','k','MarkerEdgeColor','k'); title ('2D Nonclassical multidimensional scaling','FontSize',15.0) xlabel ('X') ylabel ('Y') for i=1:ND A(i,1)=0.; A(i,2)=0.; end for i=1:NCLUST nn=0; ic=int8((i*64.)/(NCLUST*1.)); for j=1:ND if (halo(j)==i) nn=nn+1; A(nn,1)=Y1(j,1); A(nn,2)=Y1(j,2); end end hold on plot(A(1:nn,1),A(1:nn,2),'o','MarkerSize',2,'MarkerFaceColor',cmap(ic,:),'MarkerEdgeColor',cmap(ic,:)); end %for i=1:ND % if (halo(i)>0) % ic=int8((halo(i)*64.)/(NCLUST*1.)); % hold on % plot(Y1(i,1),Y1(i,2),'o','MarkerSize',2,'MarkerFaceColor',cmap(ic,:),'MarkerEdgeColor',cmap(ic,:)); % end %end faa = fopen('CLUSTER_ASSIGNATION', 'w'); disp('Generated file:CLUSTER_ASSIGNATION') disp('column 1:element id') disp('column 2:cluster assignation without halo control') disp('column 3:cluster assignation with halo control') for i=1:ND fprintf(faa, '%i %i %i\n',i,cl(i),halo(i)); end