commit
2fb2affe28
|
|
@ -0,0 +1,120 @@
|
|||
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=5000;% 生成多少个数据
|
||||
Dim=3;
|
||||
clusterN=100;
|
||||
% 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) );
|
||||
% distanceIJ_t=UserSum(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<minD
|
||||
fprintf('Input must be a string\n')
|
||||
end
|
||||
|
||||
sumKjih=sumKjih+Kjih;
|
||||
end
|
||||
if sumKjih<minKjih
|
||||
minKjih=sumKjih;
|
||||
minSetS=cadSetS;
|
||||
minUSetS=cadUSetS;
|
||||
end
|
||||
end
|
||||
end
|
||||
if minKjih<0
|
||||
minKjih
|
||||
SetS=minSetS;
|
||||
USetS=minUSetS;
|
||||
SetS
|
||||
else
|
||||
minKjih
|
||||
SetS
|
||||
fprintf('clustering is done.\n')
|
||||
break;
|
||||
end
|
||||
end
|
||||
toc
|
||||
Loading…
Reference in New Issue