if distance<minD
                        min2D=minD;
                        minD=distance;
                    else
                        if distance<min2D
                            min2D=distance;
                        end
                    end
修复这里的bug,因为更新minD后,旧的值应该给min2D,旧的值是第二小的了。

2.

if abs(distanceIJ-minD)<1e-5
                    Kjih=min([distanceHJ,min2D])-minD;
                elseif distanceIJ<sminD
                    fprintf('Input must be a string\n')
                end

由于舍入误差的原因,可能distanceIJ与sminD相等的时候distanceIJ<sminD仍成立。

Signed-off-by: facat@lab.com <facat@lab.com>
This commit is contained in:
facat@lab.com 2014-12-08 11:36:43 +08:00
parent 91ece41bae
commit d45c8c4eab
2 changed files with 43 additions and 17 deletions

58
main.m
View File

@ -16,7 +16,8 @@ clusterN=10;
% end
data=rand(Dim,dataN);
data=load('data');
data=data.data;
SetS=[1;];
@ -37,18 +38,21 @@ for clusterI=1:clusterN-1
d=data(:,J);
%ѰÕÒ×î̾àÀë
minD=1e20;
for D=1:length(SetS)%between j and the closest object in S.
% if J==cadSetS(D)
% continue
% end
distance=sum((d-data(:,SetS(D))).^2).^.5;
% for D=1:length(SetS)%between j and the closest object in S.
% % distance=sum((d-data(:,SetS(D))).^2).^.5;
% distance=metricFun( d,data(:,SetS(D)) );
if distance<minD
minD=distance;
end
end
distanceIJ=sum((d-data(:,cddtI)).^2).^.5;
% distanceIJ=metricFun( d,data(:,cddtI) );
% if distance<minD
% minD=distance;
% end
% end
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;
@ -80,10 +84,12 @@ while 1
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;
% distance=metricFun( d,data(:,SetS(G)) );
% distance=sum((d-data(:,SetS(G))).^2).^.5;
distance=metricFun( d,data(:,SetS(G)) );
if distance<minD
min2D=minD;
minD=distance;
else
if distance<min2D
@ -92,6 +98,24 @@ while 1
end
end
smatDistance=repmat(d,1,length(SetS));
sminD=smatDistance-data(:,SetS);
sminD=diag(sminD'*sminD).^.5;
tsminD=sminD;
sminD_t=min(sminD);
sminD(sminD==sminD_t)=1e20;
smin2D=min(sminD);
sminD=sminD_t;
if abs(sminD-minD)>1e-5 || abs(smin2D-min2D)>1e-5
fdf=0;
end
% minD=sminD;
% minD
% sminD
% min2D=smin2D;
% 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;
@ -99,12 +123,12 @@ while 1
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;
elseif distanceIJ<sminD
fprintf('Input must be a string\n')
end
sumKjih=sumKjih+Kjih;
end
if sumKjih<minKjih

View File

@ -1,4 +1,6 @@
function [ output_args ] = metricFun( a,b )
output_args=sum((a-b).^2).^.5;
% output_args=(a-b)'*(a-b);
% output_args=sum(abs(a-b));
end