pam/main.m

120 lines
3.1 KiB
Matlab

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