annotate toolboxes/MIRtoolbox1.3.2/somtoolbox/som_order_cplanes.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function P = som_order_cplanes(sM, varargin)
Daniel@0 2
Daniel@0 3 %SOM_ORDER_CPLANES Orders and shows the SOM component planes.
Daniel@0 4 %
Daniel@0 5 % P = som_order_cplanes(sM, [[argID,] value, ...])
Daniel@0 6 %
Daniel@0 7 % som_order_cplanes(sM);
Daniel@0 8 % som_order_cplanes(sM,'comp',1:30,'simil',C,'pca');
Daniel@0 9 % P = som_order_cplanes(sM);
Daniel@0 10 %
Daniel@0 11 % Input and output arguments ([]'s are optional):
Daniel@0 12 % sM (struct) map or data struct
Daniel@0 13 % (matrix) a data matrix, size * x dim
Daniel@0 14 % [argID, (string) See below. The values which are unambiguous can
Daniel@0 15 % value] (varies) be given without the preceeding argID.
Daniel@0 16 %
Daniel@0 17 % P (matrix) size n x * (typically n x 2), the projection coordinates
Daniel@0 18 %
Daniel@0 19 % Here are the valid argument IDs and corresponding values. The values
Daniel@0 20 % which are unambiguous (marked with '*') can be given without the
Daniel@0 21 % preceeding argID.
Daniel@0 22 % 'comp' (vector) size 1 x n, which components to project, 1:dim by default
Daniel@0 23 % 'simil' *(string) similarity measure to use
Daniel@0 24 % 'corr' linear correlation between component planes
Daniel@0 25 % 'abs(corr)' absolute value of correlation (default)
Daniel@0 26 % 'umat' as 'abs(corr)' but calculated from U-matrices
Daniel@0 27 % 'mutu' mutual information (not implemented yet)
Daniel@0 28 % (matrix) size n x n, a similarity matrix to be used
Daniel@0 29 % 'proj' *(string) projection method to use: 'SOM' (default),
Daniel@0 30 % 'pca', 'sammon', 'cca', 'order', 'ring'
Daniel@0 31 % 'msize' (vector) size of the SOM that is used for projection
Daniel@0 32 % 'show' *(string) how visualization is done: 'planes' (default),
Daniel@0 33 % 'names', or 'none'
Daniel@0 34 % 'mask' (vector) dim x 1, the mask to use, ones(dim,1) by default
Daniel@0 35 % 'comp_names' (cell array) of strings, size dim x 1, the component names
Daniel@0 36 %
Daniel@0 37 % The visualized objects have a callback associated with them: by
Daniel@0 38 % clicking on the object, the index and name of the component are printed
Daniel@0 39 % to the standard output.
Daniel@0 40 %
Daniel@0 41 % See also SOM_SHOW.
Daniel@0 42
Daniel@0 43 % Copyright (c) 2000 by the SOM toolbox programming team.
Daniel@0 44 % Contributed to SOM Toolbox on June 16th, 2000 by Juha Vesanto
Daniel@0 45 % http://www.cis.hut.fi/projects/somtoolbox/
Daniel@0 46
Daniel@0 47 % Version 2.0beta juuso 120600 070601
Daniel@0 48
Daniel@0 49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 50 %% check arguments
Daniel@0 51
Daniel@0 52 % sM
Daniel@0 53 if isstruct(sM),
Daniel@0 54 switch sM.type
Daniel@0 55 case 'som_map',
Daniel@0 56 D = sM.codebook; dim = size(D,2); cnames = sM.comp_names; mask = sM.mask;
Daniel@0 57 ismap = 1;
Daniel@0 58 case 'som_data',
Daniel@0 59 D = sM.data; dim = size(D,2); cnames = sM.comp_names; mask = ones(dim,1);
Daniel@0 60 ismap = 0;
Daniel@0 61 otherwise, error('Invalid first argument.');
Daniel@0 62 end
Daniel@0 63 else
Daniel@0 64 D = sM;
Daniel@0 65 dim = size(D,2); mask = ones(dim,1);
Daniel@0 66 cnames = cell(dim,1);
Daniel@0 67 for i = 1:dim, cnames{i} = sprintf('Variable%d',i); end
Daniel@0 68 ismap = 0;
Daniel@0 69 end
Daniel@0 70
Daniel@0 71 % defaults
Daniel@0 72 comps = 1:dim;
Daniel@0 73 simil = 'abs(corr)';
Daniel@0 74 proj = 'SOM';
Daniel@0 75 show = 'planes';
Daniel@0 76 mapsize = NaN;
Daniel@0 77
Daniel@0 78 % varargin
Daniel@0 79 i=1;
Daniel@0 80 while i<=length(varargin),
Daniel@0 81 argok = 1;
Daniel@0 82 if ischar(varargin{i}),
Daniel@0 83 switch varargin{i},
Daniel@0 84 % argument IDs
Daniel@0 85 case 'mask', i=i+1; mask = varargin{i};
Daniel@0 86 case 'comp_names', i=i+1; cnames = varargin{i};
Daniel@0 87 case 'comp', i=i+1; comps = varargin{i};
Daniel@0 88 case 'proj', i=i+1; proj = varargin{i};
Daniel@0 89 case 'show', i=i+1; show = varargin{i};
Daniel@0 90 case 'simil', i=i+1; simil = varargin{i};
Daniel@0 91 case 'msize', i=i+1; mapsize = varargin{i};
Daniel@0 92 % unambiguous values
Daniel@0 93 case {'corr','abs(corr)','umat','mutu'}, simil = varargin{i};
Daniel@0 94 case {'SOM','pca','sammon','cca','order','ring'}, proj = varargin{i};
Daniel@0 95 case {'planes','names','none'}, show = varargin{i};
Daniel@0 96 otherwise argok=0;
Daniel@0 97 end
Daniel@0 98 else
Daniel@0 99 argok = 0;
Daniel@0 100 end
Daniel@0 101 if ~argok,
Daniel@0 102 disp(['(som_order_cplanes) Ignoring invalid argument #' num2str(i+1)]);
Daniel@0 103 end
Daniel@0 104 i = i+1;
Daniel@0 105 end
Daniel@0 106
Daniel@0 107 if strcmp(show,'planes') & ~ismap,
Daniel@0 108 warning('Given data is not a map: using ''names'' visualization.');
Daniel@0 109 show = 'names';
Daniel@0 110 end
Daniel@0 111
Daniel@0 112 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 113 %% similarity matrix
Daniel@0 114
Daniel@0 115 fprintf(1,'Calculating similarity matrix\n');
Daniel@0 116
Daniel@0 117 % use U-matrix
Daniel@0 118 if strcmp(simil,'umat'),
Daniel@0 119 if ~ismap, error('Given data is not a map: cannot use U-matrix similarity.'); end
Daniel@0 120 U = som_umat(sM);
Daniel@0 121 D = zeros(prod(size(U)),dim);
Daniel@0 122 m = zeros(dim,1);
Daniel@0 123 for i=1:dim, m=m*0; m(i)=1; U = som_umat(sM,'mask',m); D(:,i) = U(:); end
Daniel@0 124 end
Daniel@0 125
Daniel@0 126 % components
Daniel@0 127 D = D(:,comps);
Daniel@0 128 cnames = cnames(comps);
Daniel@0 129 mask = mask(comps);
Daniel@0 130 dim = length(comps);
Daniel@0 131
Daniel@0 132 % similarity matrix
Daniel@0 133 if ischar(simil),
Daniel@0 134 switch simil,
Daniel@0 135 case {'corr','abs(corr)','umat'},
Daniel@0 136 A = zeros(dim);
Daniel@0 137 me = zeros(1,dim);
Daniel@0 138 for i=1:dim,
Daniel@0 139 me(i) = mean(D(isfinite(D(:,i)),i)); D(:,i) = D(:,i) - me(i);
Daniel@0 140 end
Daniel@0 141 for i=1:dim,
Daniel@0 142 for j=i:dim,
Daniel@0 143 c = D(:,i).*D(:,j); c = c(isfinite(c));
Daniel@0 144 A(i,j) = sum(c)/length(c); A(j,i) = A(i,j);
Daniel@0 145 end
Daniel@0 146 end
Daniel@0 147 s = diag(A);
Daniel@0 148 A = A./sqrt(s*s');
Daniel@0 149 switch simil,
Daniel@0 150 case {'abs(corr)','umat'}, A = abs(A);
Daniel@0 151 case 'corr', A = A + 1;
Daniel@0 152 end
Daniel@0 153 case 'mutu',
Daniel@0 154 error('Mutual information not implemented yet.');
Daniel@0 155 end
Daniel@0 156 else
Daniel@0 157 A = simil;
Daniel@0 158 end
Daniel@0 159
Daniel@0 160 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 161 %% projection
Daniel@0 162
Daniel@0 163 fprintf(1,'Projection\n');
Daniel@0 164
Daniel@0 165 mu = 2*dim;
Daniel@0 166
Daniel@0 167 switch proj,
Daniel@0 168 case 'SOM',
Daniel@0 169
Daniel@0 170 if isnan(mapsize),
Daniel@0 171 sMtmp = som_randinit(A,'munits',mu);
Daniel@0 172 msize = sMtmp.topol.msize;
Daniel@0 173 else
Daniel@0 174 msize = mapsize;
Daniel@0 175 end
Daniel@0 176
Daniel@0 177 sM2 = som_make(A,'msize',msize,'rect','tracking',0);
Daniel@0 178 bm = assign_unique_bm(sM2,A);
Daniel@0 179 Co = som_unit_coords(sM2);
Daniel@0 180 P = Co(bm,:);
Daniel@0 181
Daniel@0 182 case 'ring',
Daniel@0 183
Daniel@0 184 if isnan(mapsize), msize = [1 mu]; else msize = mapsize; end
Daniel@0 185
Daniel@0 186 sM2 = som_make(A,'msize',msize,'cyl','rect','tracking',0);
Daniel@0 187 bm = assign_unique_bm(sM2,A);
Daniel@0 188 Co = som_unit_coords(sM2);
Daniel@0 189 P = Co(bm,[1 3]);
Daniel@0 190
Daniel@0 191 case 'order',
Daniel@0 192
Daniel@0 193 if isnan(mapsize), msize = [1 mu]; else msize = mapsize; end
Daniel@0 194
Daniel@0 195 sM2 = som_make(A,'msize',msize,'tracking',0);
Daniel@0 196 bm = assign_unique_bm(sM2,A);
Daniel@0 197 [dummy,i] = sort(bm);
Daniel@0 198 [dummy,P] = sort(i);
Daniel@0 199 if size(P,2)>1, P = P'; end
Daniel@0 200 if size(P,2)==1, P(:,2) = zeros(length(P),1); end
Daniel@0 201
Daniel@0 202 case {'pca','sammon','cca'},
Daniel@0 203 P = pcaproj(A,2);
Daniel@0 204 if strcmp(proj,'sammon'), P = sammon(A,P,50,'steps');
Daniel@0 205 elseif strcmp(proj,'cca'), P = cca(A,P,50);
Daniel@0 206 end
Daniel@0 207
Daniel@0 208 end
Daniel@0 209
Daniel@0 210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 211 %% visualization
Daniel@0 212
Daniel@0 213 if ~strcmp(show,'none'),
Daniel@0 214 fprintf(1,'Visualization\n');
Daniel@0 215 cla
Daniel@0 216 hold on
Daniel@0 217 if strcmp(show,'planes')
Daniel@0 218 s = findscaling(sM.topol.msize,P);
Daniel@0 219 for i=1:dim,
Daniel@0 220 C = som_normcolor(D(:,i));
Daniel@0 221 if strcmp(simil,'umat'),
Daniel@0 222 h=som_cplane([sM.topol.lattice 'U'],sM.topol.msize,C,1,s*P(i,:));
Daniel@0 223 else
Daniel@0 224 h=som_cplane(sM,C,1,s*P(i,:));
Daniel@0 225 end
Daniel@0 226 set(h,'edgecolor','none','Userdata',sprintf('[%d] %s',i,cnames{i}));
Daniel@0 227 set(h,'ButtonDownFcn','fprintf(1,''%s\n'',get(gco,''UserData''))');
Daniel@0 228 end
Daniel@0 229 else
Daniel@0 230 s=1;
Daniel@0 231 a=[min(P(:,1))-1 max(P(:,1))+1 min(P(:,2))-1-3 max(P(:,2))+1-3];
Daniel@0 232 axis(s*a);
Daniel@0 233 end
Daniel@0 234 h=text(s*P(:,1),s*P(:,2)-3,cnames);
Daniel@0 235 for i=1:length(h), set(h(i),'Userdata',sprintf('[%d] %s',i,cnames{i})); end
Daniel@0 236 set(h,'ButtonDownFcn','fprintf(1,''%s\n'',get(gco,''UserData''))');
Daniel@0 237 hold off
Daniel@0 238
Daniel@0 239 axis on; axis equal; axis tight; set(gca,'XTick',[],'YTick',[],'Box','on');
Daniel@0 240 end
Daniel@0 241
Daniel@0 242 return;
Daniel@0 243
Daniel@0 244 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5
Daniel@0 245 %% subfunctions
Daniel@0 246
Daniel@0 247 function bm = assign_unique_bm(sM,D)
Daniel@0 248
Daniel@0 249 munits = size(sM.codebook,1);
Daniel@0 250 [dlen dim] = size(D);
Daniel@0 251 margin = max(0,dlen-munits);
Daniel@0 252
Daniel@0 253 [bm,qers] = som_bmus(sM,D);
Daniel@0 254 bmi=ones(dim,1);
Daniel@0 255 hits = som_hits(sM,D);
Daniel@0 256 mult = find(hits>1);
Daniel@0 257 while any(mult) & sum(hits(mult))-length(mult)>margin,
Daniel@0 258 choices = find(bm==mult(1));
Daniel@0 259 while length(choices)>1,
Daniel@0 260 [dummy,mv] = max(qers(choices)); mv = choices(mv);
Daniel@0 261 [mv_to,q] = som_bmus(sM,D(mv,:),bmi(mv));
Daniel@0 262 bmi(mv)=bmi(mv)+1; qers(mv) = q; bm(mv) = mv_to;
Daniel@0 263 choices = find(bm==mv_to);
Daniel@0 264 end
Daniel@0 265 for i=1:length(hits), hits(i)=sum(bm==i); end
Daniel@0 266 mult = find(hits>1);
Daniel@0 267 end
Daniel@0 268 return;
Daniel@0 269
Daniel@0 270 function s = findscaling(msize,P)
Daniel@0 271
Daniel@0 272 d1 = median(abs(diff(unique(sort(P(:,1))))));
Daniel@0 273 d2 = median(abs(diff(unique(sort(P(:,2))))));
Daniel@0 274 if d1>0, s1 = 1.5*msize(2)/d1; else s1 = 0; end
Daniel@0 275 if d2>0, s2 = 1.5*msize(1)/d2; else s2 = 0; end
Daniel@0 276 s = max(s1,s2);
Daniel@0 277 if s==0, s=1; end
Daniel@0 278 return;
Daniel@0 279
Daniel@0 280 function alternative_SOM_plane_vis(sT,bm,simil,D,cnames)
Daniel@0 281
Daniel@0 282 clf
Daniel@0 283 for i=1:size(D,2),
Daniel@0 284 subplot(sT.msize(2),sT.msize(1),bm(i));
Daniel@0 285 if strcmp(simil,'umat'), h=som_cplane([sT.lattice 'U'],sT.msize,D(:,i));
Daniel@0 286 else h=som_cplane(sT,D(:,i));
Daniel@0 287 end
Daniel@0 288 set(h,'edgecolor','none');
Daniel@0 289 title(cnames{i});
Daniel@0 290 axis off
Daniel@0 291 end
Daniel@0 292 return;
Daniel@0 293