clc clear close all tic %先形成初始点 center=[1,1,1,1,1;10,10,10,10,10;100,100,100,100,100;1000,1000,1000,1000,1000]; % center=[1;10;100;1000]; dataN=100;% 生成多少个数据 Dim=5; clusterN=10; % data=zeros(Dim,dataN); % % data=[11,101,1001,1,2,3]; % for I=1:dataN % i=round(1+(4-1)*rand()); % data(:,I)=center(i)*( -1+(1+1)*rand(Dim,1)); % end data=rand(Dim,dataN); data=load('data'); data=data.data; SetS=[1;]; for clusterI=1:clusterN-1 maxG=-100*ones(dataN,1); for cluster=1:dataN if sum(ismember(cluster,SetS))>0 continue end %选一个候选数据 cddtI=cluster; cadSetS=[SetS;cddtI;]; Cij=0; for J=1:dataN if sum(ismember(J,cadSetS))>0 continue end d=data(:,J); %寻找最短距离 matDistance=repmat(d,1,length(SetS)); minD=matDistance-data(:,SetS); minD=diag(minD'*minD); minD=min(minD.^.5); % distanceIJ=sum((d-data(:,cddtI)).^2).^.5; distanceIJ=metricFun( d,data(:,cddtI) ); Cij=Cij+max([minD-distanceIJ,0]); end maxG(cluster)=Cij; end maxGInd=find(maxG==max(maxG)); SetS=[SetS;maxGInd(1)]; end SetS %% 进入SWAP部分 % SetS=[1;2;3]; USetS=setxor(1:dataN,SetS); while 1 minKjih=1e20; for I=1:length(SetS) for H=1:length(USetS) %交换两个集合的元素 cadSetS=SetS; cadUSetS=USetS; swap=cadSetS(I); cadSetS(I)=cadUSetS(H); cadUSetS(H)=swap; sumKjih=0; for D=1:length(cadUSetS) J=cadUSetS(D); d=data(:,J); if J==cadSetS(I) continue end matDistance=repmat(d,1,length(SetS)); minD=matDistance-data(:,SetS); minD=diag(minD'*minD).^.5; minD_t=min(minD); minD(minD==minD_t)=1e20; min2D=min(minD); minD=minD_t; % distanceIJ=sum((d-data(:,cadUSetS(H))).^2).^.5;%S(I)已经等于U(H) distanceIJ=metricFun( d,data(:,cadUSetS(H)) ); % distanceHJ=sum((d-data(:,cadSetS(I))).^2).^.5; distanceHJ=metricFun( d,data(:,cadSetS(I)) ); if distanceIJ>minD Kjih=min([distanceHJ-minD,0]); end if abs(distanceIJ-minD)<1e-5 Kjih=min([distanceHJ,min2D])-minD; elseif distanceIJ