From 2fb2affe28a3065a7eeaee5c4d072ed13cf53766 Mon Sep 17 00:00:00 2001 From: "facat@lab.com" Date: Mon, 8 Dec 2014 22:31:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: facat@lab.com --- m.txt | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pam.go | 10 +++++ 2 files changed, 130 insertions(+) create mode 100644 m.txt create mode 100644 pam.go diff --git a/m.txt b/m.txt new file mode 100644 index 0000000..e780a34 --- /dev/null +++ b/m.txt @@ -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