Home > FR3DSource > zOrderbySimilarity.m

zOrderbySimilarity

PURPOSE ^

zOrderbySimilarity uses the result of a cluster analysis and puts the

SYNOPSIS ^

function [q] = zOrderbySimilarity(DD)

DESCRIPTION ^

 zOrderbySimilarity uses the result of a cluster analysis and puts the
 instances in order, consistent with the tree, so that similar branches are
 near each other in the list

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 % zOrderbySimilarity uses the result of a cluster analysis and puts the
0002 % instances in order, consistent with the tree, so that similar branches are
0003 % near each other in the list
0004 
0005 % DD is a symmetric mutual distance matrix
0006 % q is a permutation
0007 
0008 function [q] = zOrderbySimilarity(DD)
0009 
0010 [s,t] = size(DD);
0011 
0012 W = 2.^(-abs(ones(s,1)*(1:s) - (1:s)'*ones(1,s)));  % weight matrix
0013 
0014 % ----------------------------------------- Cluster analysis
0015 
0016 D = full(DD);
0017 for i = 1:s,
0018   D(i,i) = 0;                                  % set diagonal to zero
0019 end
0020 
0021 Y = squareform(full(D));                       % convert to a vector
0022 Z = linkage(Y,'average');                      % compute cluster tree
0023 
0024 % D is the square matrix giving mutual distances, with zero down the diagonal
0025 % Y is a vector, needed for the linkage function
0026 % Z is the linkage, telling what coalesces with what
0027 
0028 % ----------------------------------------- Re-order the elements in groups
0029 
0030 q = 1:s;                                % simplest ordering, doesn't do well
0031 
0032 for i = 1:s,
0033   Group{i} = i;                         % initial groups have one element
0034 end
0035 
0036 gc = s;                                 % group counter
0037 
0038 for z = 1:length(Z(:,1)),
0039   g  = Group{Z(z,1)};
0040   h  = Group{Z(z,2)};
0041   gg = fliplr(g);
0042 
0043   S(1) = Score(D([g h],[g h]),W);
0044   S(2) = Score(D([h g],[h g]),W);
0045   S(3) = Score(D([gg h],[gg h]),W);
0046   S(4) = Score(D([h gg],[h gg]),W);
0047 
0048   [y,i] = sort(S);
0049 
0050   switch i(1)
0051     case 1, Group{gc+1} = [g h];
0052     case 2, Group{gc+1} = [h g];
0053     case 3, Group{gc+1} = [gg h];
0054     case 4, Group{gc+1} = [h gg];
0055   end
0056 
0057   gc = gc + 1;
0058 end
0059 
0060 q = Group{end};
0061 
0062 % -----------------------------------------------------------------------
0063 % The Score function tells which type of distance matrix is preferred.
0064 % This simple scoring scheme prefers small values near the diagonal.
0065 
0066 function [S] = Score(M,W)
0067 
0068 % S = 2*sum(diag(M,1)) + sum(diag(M,2));
0069 
0070 [s,t] = size(M);
0071 S = sum(sum(M .* W(1:s,1:t)));
0072

Generated on Fri 03-Apr-2009 09:52:35 by m2html © 2003