写完了,应该是正确的

Signed-off-by: facat@lab.com <facat@lab.com>
This commit is contained in:
facat@lab.com 2014-12-07 17:25:34 +08:00
parent cad0a2c7d4
commit b88dc13f9a
1 changed files with 73 additions and 4 deletions

77
main.m
View File

@ -3,10 +3,12 @@ clear
close all close all
% %
center=[1,1,1,1,1;10,10,10,10,10;100,100,100,100,100;1000,1000,1000,1000,1000]; 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]; % center=[1;10;100;1000];
dataN=50;% dataN=100;%
Dim=1; Dim=5;
clusterN=5;
data=zeros(Dim,dataN); data=zeros(Dim,dataN);
% data=[11,101,1001,1,2,3];
for I=1:dataN for I=1:dataN
i=round(1+(4-1)*rand()); i=round(1+(4-1)*rand());
data(:,I)=center(i)*( -1+(1+1)*rand(Dim,1)); data(:,I)=center(i)*( -1+(1+1)*rand(Dim,1));
@ -15,7 +17,7 @@ end
SetS=[1;]; SetS=[1;];
for clusterI=1:3 for clusterI=1:clusterN-1
maxG=-100*ones(dataN,1); maxG=-100*ones(dataN,1);
for cluster=1:dataN for cluster=1:dataN
if sum(ismember(cluster,SetS))>0 if sum(ismember(cluster,SetS))>0
@ -48,4 +50,71 @@ for clusterI=1:3
end end
maxGInd=find(maxG==max(maxG)); maxGInd=find(maxG==max(maxG));
SetS=[SetS;maxGInd(1)]; 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
minD=1e20;
min2D=minD;
for G=1:length(SetS)%between j and the closest object in S.
distance=sum((d-data(:,SetS(G))).^2).^.5;
if distance<minD
minD=distance;
else
if distance<min2D
min2D=distance;
end
end
end
distanceIJ=sum((d-data(:,cadUSetS(H))).^2).^.5;%S(I)U(H)
distanceHJ=sum((d-data(:,cadSetS(I))).^2).^.5;
if distanceIJ>minD
Kjih=min([distanceHJ-minD,0]);
end
if distanceIJ<minD
fprintf('Input must be a string\n')
end
if abs(distanceIJ-minD)<1e-5
Kjih=min([distanceHJ,min2D])-minD;
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 end