matlab 密度聚类中心点,密度峰值聚类算法MATLAB程序

密度峰值聚类算法MATLAB程序

数据见: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)

% 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))=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)

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

2. 结果

matlab 密度聚类中心点,密度峰值聚类算法MATLAB程序_第1张图片

你可能感兴趣的:(matlab,密度聚类中心点)