annotate toolboxes/MIRtoolbox1.3.2/somtoolbox/som_info.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 som_info(sS,level)
Daniel@0 2
Daniel@0 3 %SOM_INFO Displays information on the given SOM Toolbox struct.
Daniel@0 4 %
Daniel@0 5 % som_info(sS,[level])
Daniel@0 6 %
Daniel@0 7 % som_info(sMap);
Daniel@0 8 % som_info(sData,3);
Daniel@0 9 % som_info({sMap,sData});
Daniel@0 10 % som_info(sMap.comp_norm{2});
Daniel@0 11 %
Daniel@0 12 % Input and output arguments ([]'s are optional):
Daniel@0 13 % sS (struct) SOM Toolbox struct
Daniel@0 14 % (cell array of structs) several structs in a cell array
Daniel@0 15 % [level] (scalar) detail level (1-4), default = 1
Daniel@0 16 %
Daniel@0 17 % For more help, try 'type som_info' or check out online documentation.
Daniel@0 18 % See also SOM_SET.
Daniel@0 19
Daniel@0 20 %%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 21 %
Daniel@0 22 % som_info
Daniel@0 23 %
Daniel@0 24 % PURPOSE
Daniel@0 25 %
Daniel@0 26 % Display information of the given SOM Toolbox struct(s).
Daniel@0 27 %
Daniel@0 28 % SYNTAX
Daniel@0 29 %
Daniel@0 30 % som_info(sM)
Daniel@0 31 % som_info({sM,sD})
Daniel@0 32 % som_info(...,level)
Daniel@0 33 %
Daniel@0 34 % DESCRIPTION
Daniel@0 35 %
Daniel@0 36 % Display the contents of the given SOM Toolbox struct(s). Information
Daniel@0 37 % of several structs can be shown if the structs are given in a cell
Daniel@0 38 % array. The level of detail can be varied with the second argument.
Daniel@0 39 % The number of different levels varies between structs. For map and
Daniel@0 40 % data structs, not only the fields, but also some statistics of the
Daniel@0 41 % vectors ('.data' and '.codebook' fields) is displayed.
Daniel@0 42 %
Daniel@0 43 % map struct
Daniel@0 44 % level 1: name, dimension, topology, dimension, neigborhood function,
Daniel@0 45 % mask and training status
Daniel@0 46 % level 2: ..., training history
Daniel@0 47 % level 3: ..., vector component names, statistics and normalization status
Daniel@0 48 % level 4: ..., vector component normalizations
Daniel@0 49 %
Daniel@0 50 % data struct:
Daniel@0 51 % level 1: name, dimension, data set completeness statistics
Daniel@0 52 % level 2: ..., vector component names, statistics and normalization status
Daniel@0 53 % level 3: ..., vector component normalizations
Daniel@0 54 % level 4: ..., label statistics
Daniel@0 55 %
Daniel@0 56 % topology struct:
Daniel@0 57 % level 1: all fields
Daniel@0 58 %
Daniel@0 59 % train struct:
Daniel@0 60 % level 1: all fields
Daniel@0 61 %
Daniel@0 62 % normalization struct:
Daniel@0 63 % level 1: method, status
Daniel@0 64 % level 2: ..., parameters
Daniel@0 65 %
Daniel@0 66 % REQUIRED INPUT ARGUMENTS
Daniel@0 67 %
Daniel@0 68 % sS (struct) SOM Toolbox struct
Daniel@0 69 % (cell array of structs) several structs in a cell array
Daniel@0 70 %
Daniel@0 71 % OPTIONAL INPUT ARGUMENTS
Daniel@0 72 %
Daniel@0 73 % level (scalar) detail level (1-4), default = 1
Daniel@0 74 %
Daniel@0 75 % EXAMPLES
Daniel@0 76 %
Daniel@0 77 % som_info(sM)
Daniel@0 78 % som_info(sM,4)
Daniel@0 79 % som_info(sM.trainhist)
Daniel@0 80 % som_info(sM.comp_norm{3})
Daniel@0 81 %
Daniel@0 82 % SEE ALSO
Daniel@0 83 %
Daniel@0 84 % som_set Set fields and create SOM Toolbox structs.
Daniel@0 85
Daniel@0 86 % Copyright (c) 1999-2000 by the SOM toolbox programming team.
Daniel@0 87 % http://www.cis.hut.fi/projects/somtoolbox/
Daniel@0 88
Daniel@0 89 % Version 1.0beta ecco 110997
Daniel@0 90 % Version 2.0beta juuso 101199
Daniel@0 91
Daniel@0 92 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 93 %% check arguments
Daniel@0 94
Daniel@0 95 error(nargchk(1, 2, nargin)) % check no. of input args is correct
Daniel@0 96
Daniel@0 97 if ~isstruct(sS),
Daniel@0 98 if ~iscell(sS) | ~isstruct(sS{1}),
Daniel@0 99 error('Invalid first input argument.')
Daniel@0 100 end
Daniel@0 101 csS = sS;
Daniel@0 102 else
Daniel@0 103 l = length(sS);
Daniel@0 104 csS = cell(l,1);
Daniel@0 105 for i=1:l, csS{i} = sS(i); end
Daniel@0 106 end
Daniel@0 107
Daniel@0 108 if nargin<2 | isempty(level) | isnan(level), level = 1; end
Daniel@0 109
Daniel@0 110 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Daniel@0 111 %% print struct information
Daniel@0 112
Daniel@0 113 for c=1:length(csS),
Daniel@0 114 sS = csS{c};
Daniel@0 115 fprintf(1,'\n');
Daniel@0 116
Daniel@0 117 switch sS.type,
Daniel@0 118 case 'som_map',
Daniel@0 119 mdim = length(sS.topol.msize);
Daniel@0 120 [munits dim] = size(sS.codebook);
Daniel@0 121 t = length(sS.trainhist);
Daniel@0 122 if t==0, st='uninitialized';
Daniel@0 123 elseif t==1, st = 'initialized';
Daniel@0 124 else st = sprintf('initialized, trained %d times',t-1);
Daniel@0 125 end
Daniel@0 126
Daniel@0 127 % level 1
Daniel@0 128 fprintf(1,'Struct type : %s\n', sS.type);
Daniel@0 129 fprintf(1,'Map name : %s\n', sS.name);
Daniel@0 130 fprintf(1,'Input dimension : %d\n', dim);
Daniel@0 131 fprintf(1,'Map grid size : ');
Daniel@0 132 for i = 1:mdim - 1, fprintf(1,'%d x ',sS.topol.msize(i)); end
Daniel@0 133 fprintf(1,'%d\n', sS.topol.msize(mdim));
Daniel@0 134 fprintf(1,'Lattice type (rect/hexa) : %s\n', sS.topol.lattice);
Daniel@0 135 fprintf(1,'Shape (sheet/cyl/toroid) : %s\n', sS.topol.shape);
Daniel@0 136 fprintf(1,'Neighborhood type : %s\n', sS.neigh);
Daniel@0 137 fprintf(1,'Mask : ');
Daniel@0 138 if dim,
Daniel@0 139 for i = 1:dim-1, fprintf(1,'%d ',sS.mask(i)); end;
Daniel@0 140 fprintf(1,'%d\n',sS.mask(dim));
Daniel@0 141 else fprintf(1,'\n');
Daniel@0 142 end
Daniel@0 143 fprintf(1,'Training status : %s\n', st);
Daniel@0 144
Daniel@0 145 % level 1,
Daniel@0 146 status = cell(dim,1);
Daniel@0 147 for i=1:dim,
Daniel@0 148 n = length(sS.comp_norm{i});
Daniel@0 149 if n,
Daniel@0 150 uninit = strcmp('uninit',{sS.comp_norm{i}.status});
Daniel@0 151 done = strcmp('done',{sS.comp_norm{i}.status});
Daniel@0 152 undone = strcmp('undone',{sS.comp_norm{i}.status});
Daniel@0 153 if sum(uninit)==n, status{i} = 'none';
Daniel@0 154 elseif sum(done)==n, status{i} = 'done';
Daniel@0 155 elseif sum(undone)==n, status{i} = 'undone';
Daniel@0 156 else status{i} = 'partial';
Daniel@0 157 end
Daniel@0 158 else status{i} = 'no normalization'; end
Daniel@0 159 end
Daniel@0 160 if level>1,
Daniel@0 161 fprintf(1,'\nVector components\n');
Daniel@0 162 M = sS.codebook;
Daniel@0 163 fprintf(1,' # name mask min mean max std normalization\n');
Daniel@0 164 fprintf(1,' --- ------------ ---- ------ ------ ------ ------ -------------\n');
Daniel@0 165 for i = 1:dim,
Daniel@0 166 fprintf(1,' %-3d %-12s %-4.2f %6.2g %6.2g %6.2g %6.2g %s\n', ...
Daniel@0 167 i,sS.comp_names{i}, sS.mask(i), ...
Daniel@0 168 min(M(:,i)),mean(M(:,i)),max(M(:,i)),std(M(:,i)),status{i});
Daniel@0 169 end
Daniel@0 170 end
Daniel@0 171
Daniel@0 172 % level 3
Daniel@0 173 if level>2,
Daniel@0 174 fprintf(1,'\nVector component normalizations\n');
Daniel@0 175 fprintf(1,' # name method (i=uninit,u=undone,d=done)\n');
Daniel@0 176 fprintf(1,' --- ------------ ---------------------------------------\n');
Daniel@0 177 for i=1:dim,
Daniel@0 178 fprintf(1,' %-3d %-12s ',i,sS.comp_names{i});
Daniel@0 179 n = length(sS.comp_norm{i});
Daniel@0 180 for j=1:n,
Daniel@0 181 m = sS.comp_norm{i}(j).method;
Daniel@0 182 s = sS.comp_norm{i}(j).status;
Daniel@0 183 if strcmp(s,'uninit'), c='i';
Daniel@0 184 elseif strcmp(s,'undone'), c='u';
Daniel@0 185 else c='d';
Daniel@0 186 end
Daniel@0 187 fprintf(1,'%s[%s] ',m,c);
Daniel@0 188 end
Daniel@0 189 fprintf(1,'\n');
Daniel@0 190 end
Daniel@0 191 end
Daniel@0 192
Daniel@0 193 % level 4
Daniel@0 194 if level>3,
Daniel@0 195 fprintf(1,'\nTraining history\n');
Daniel@0 196 fprintf(1,'Algorithm Data Trainlen Neigh.f. Radius Alpha (type) Date\n');
Daniel@0 197 fprintf(1,'--------- ------------- -------- -------- ---------- -------------- --------------------\n');
Daniel@0 198 for i=1:t,
Daniel@0 199 sT = sS.trainhist(i);
Daniel@0 200 fprintf(1,'%8s %13s %8d %8s %4.2f->%4.2f %5.3f (%6s) %s\n',...
Daniel@0 201 sT.algorithm,sT.data_name,sT.trainlen,...
Daniel@0 202 sT.neigh,sT.radius_ini,sT.radius_fin,sT.alpha_ini,sT.alpha_type,sT.time);
Daniel@0 203 %for j = 1:length(sT.mask)-1, fprintf(1,'%d ',sT.mask(j)); end;
Daniel@0 204 %if ~isempty(sT.mask), fprintf(1,'%d\n',sT.mask(end)); else fprintf(1,'\n'); end
Daniel@0 205 end
Daniel@0 206 end
Daniel@0 207
Daniel@0 208 case 'som_data',
Daniel@0 209
Daniel@0 210 [dlen dim] = size(sS.data);
Daniel@0 211 if dlen*dim
Daniel@0 212 if dim>1, ind = find(~isnan(sum(sS.data,2)));
Daniel@0 213 else ind = find(~isnan(sS.data));
Daniel@0 214 end
Daniel@0 215 else ind = []; end
Daniel@0 216 complete = size(sS.data(ind,:),1);
Daniel@0 217 partial = dlen - complete;
Daniel@0 218 values = prod(size(sS.data));
Daniel@0 219 missing = sum(sum(isnan(sS.data)));
Daniel@0 220
Daniel@0 221 % level 1
Daniel@0 222 fprintf(1,'Struct type : %s\n', sS.type);
Daniel@0 223 fprintf(1,'Data name : %s\n', sS.name);
Daniel@0 224 fprintf(1,'Vector dimension : %d\n', dim);
Daniel@0 225 fprintf(1,'Number of data vectors : %d\n', dlen);
Daniel@0 226 fprintf(1,'Complete data vectors : %d\n', complete);
Daniel@0 227 fprintf(1,'Partial data vectors : %d\n', partial);
Daniel@0 228 if values, r = floor(100 * (values - missing) / values); else r = 0; end
Daniel@0 229 fprintf(1,'Complete values : %d of %d (%d%%)\n', ...
Daniel@0 230 values-missing, values, r);
Daniel@0 231
Daniel@0 232 % level 2,
Daniel@0 233 status = cell(dim,1);
Daniel@0 234 for i=1:dim,
Daniel@0 235 n = length(sS.comp_norm{i});
Daniel@0 236 if n,
Daniel@0 237 uninit = strcmp('uninit',{sS.comp_norm{i}.status});
Daniel@0 238 done = strcmp('done',{sS.comp_norm{i}.status});
Daniel@0 239 undone = strcmp('undone',{sS.comp_norm{i}.status});
Daniel@0 240 if sum(uninit)==n, status{i} = 'none';
Daniel@0 241 elseif sum(done)==n, status{i} = 'done';
Daniel@0 242 elseif sum(undone)==n, status{i} = 'undone';
Daniel@0 243 else status{i} = 'partial';
Daniel@0 244 end
Daniel@0 245 else status{i} = 'no normalization'; end
Daniel@0 246 end
Daniel@0 247 if level>1,
Daniel@0 248 fprintf(1,'\nVector components\n');
Daniel@0 249 D = sS.data;
Daniel@0 250 fprintf(1,' # name min mean max std missing normalization\n');
Daniel@0 251 fprintf(1,' --- ------------ ------ ------ ------ ------ ----------- -------------\n');
Daniel@0 252 for i = 1:dim,
Daniel@0 253 known = find(~isnan(D(:,i)));
Daniel@0 254 miss = dlen-length(known);
Daniel@0 255 switch length(known),
Daniel@0 256 case 0, mi = NaN; me = NaN; ma = NaN; st = NaN;
Daniel@0 257 case 1, mi = D(known,i); me = mi; ma = mi; st = 0;
Daniel@0 258 otherwise,
Daniel@0 259 mi = min(D(known,i)); ma = max(D(known,i));
Daniel@0 260 me = mean(D(known,i)); st = std(D(known,i));
Daniel@0 261 end
Daniel@0 262 fprintf(1,' %-3d %-12s %6.2g %6.2g %6.2g %6.2g %5d (%2d%%) %s\n', ...
Daniel@0 263 i,sS.comp_names{i},mi,me,ma,st,miss,floor(100*miss/dlen),status{i});
Daniel@0 264 end
Daniel@0 265 end
Daniel@0 266
Daniel@0 267 % level 3
Daniel@0 268 if level>2,
Daniel@0 269 fprintf(1,'\nVector component normalizations\n');
Daniel@0 270 fprintf(1,' # name method (i=uninit,u=undone,d=done)\n');
Daniel@0 271 fprintf(1,' --- ------------ ---------------------------------------\n');
Daniel@0 272 for i=1:dim,
Daniel@0 273 fprintf(1,' %-3d %-12s ',i,sS.comp_names{i});
Daniel@0 274 n = length(sS.comp_norm{i});
Daniel@0 275 for j=1:n,
Daniel@0 276 m = sS.comp_norm{i}(j).method;
Daniel@0 277 s = sS.comp_norm{i}(j).status;
Daniel@0 278 if strcmp(s,'uninit'), c='i';
Daniel@0 279 elseif strcmp(s,'undone'), c='u';
Daniel@0 280 else c='d';
Daniel@0 281 end
Daniel@0 282 fprintf(1,'%s[%s] ',m,c);
Daniel@0 283 end
Daniel@0 284 fprintf(1,'\n');
Daniel@0 285 end
Daniel@0 286 end
Daniel@0 287
Daniel@0 288 % level 4
Daniel@0 289 if level>3,
Daniel@0 290 m = size(sS.labels,2);
Daniel@0 291 fprintf(1,'\nLabels\n');
Daniel@0 292 if isempty(sS.label_names),
Daniel@0 293 labs = {''}; freq = 0;
Daniel@0 294 for i=1:dlen*m,
Daniel@0 295 l = sS.labels{i};
Daniel@0 296 if isempty(l), freq(1) = freq(1)+1;
Daniel@0 297 else
Daniel@0 298 k = find(strcmp(labs,l));
Daniel@0 299 if isempty(k), labs{end+1} = l; freq(end+1) = 1;
Daniel@0 300 else freq(k)=freq(k)+1;
Daniel@0 301 end
Daniel@0 302 end
Daniel@0 303 end
Daniel@0 304 emp = freq(1);
Daniel@0 305 uni = length(freq)-1;
Daniel@0 306 if uni>0, tot = sum(freq(2:end)); else tot = 0; end
Daniel@0 307 fprintf(1,' Total: %d\n Empty: %d\n Unique: %d\n',tot,emp,uni);
Daniel@0 308 else
Daniel@0 309 for j=1:m,
Daniel@0 310 labs = {''}; freq = 0;
Daniel@0 311 for i=1:dlen,
Daniel@0 312 l = sS.labels{i,j};
Daniel@0 313 if isempty(l), freq(1) = freq(1)+1;
Daniel@0 314 else
Daniel@0 315 k = find(strcmp(labs,l));
Daniel@0 316 if isempty(k), labs{end+1} = l; freq(end+1) = 1;
Daniel@0 317 else freq(k)=freq(k)+1;
Daniel@0 318 end
Daniel@0 319 end
Daniel@0 320 end
Daniel@0 321 emp = freq(1);
Daniel@0 322 uni = length(freq)-1;
Daniel@0 323 if uni>0, tot = sum(freq(2:end)); else tot = 0; end
Daniel@0 324 fprintf(1,' [%s] Total / empty / unique: %d / %d / %d\n', ...
Daniel@0 325 sS.label_names{j},tot,emp,uni);
Daniel@0 326 end
Daniel@0 327 end
Daniel@0 328 end
Daniel@0 329
Daniel@0 330 case 'som_topol',
Daniel@0 331
Daniel@0 332 mdim = length(sS.msize);
Daniel@0 333
Daniel@0 334 % level 1
Daniel@0 335 fprintf(1,'Struct type : %s\n',sS.type);
Daniel@0 336 fprintf(1,'Map grid size : ');
Daniel@0 337 for i = 1:mdim - 1, fprintf(1,'%d x ',sS.msize(i)); end
Daniel@0 338 fprintf(1,'%d\n', sS.msize(mdim));
Daniel@0 339 fprintf(1,'Lattice type (rect/hexa) : %s\n', sS.lattice);
Daniel@0 340 fprintf(1,'Shape (sheet/cyl/toroid) : %s\n', sS.shape);
Daniel@0 341
Daniel@0 342 case 'som_train',
Daniel@0 343
Daniel@0 344 % level 1
Daniel@0 345 fprintf(1,'Struct type : %s\n',sS.type);
Daniel@0 346 fprintf(1,'Training algorithm : %s\n',sS.algorithm);
Daniel@0 347 fprintf(1,'Training data : %s\n',sS.data_name);
Daniel@0 348 fprintf(1,'Neighborhood function : %s\n',sS.neigh);
Daniel@0 349 fprintf(1,'Mask : ');
Daniel@0 350 dim = length(sS.mask);
Daniel@0 351 if dim,
Daniel@0 352 for i = 1:dim-1, fprintf(1,'%d ',sS.mask(i)); end;
Daniel@0 353 fprintf(1,'%d\n',sS.mask(end));
Daniel@0 354 else fprintf(1,'\n'); end
Daniel@0 355 fprintf(1,'Initial radius : %-6.1f\n',sS.radius_ini);
Daniel@0 356 fprintf(1,'Final radius : %-6.1f\n',sS.radius_fin);
Daniel@0 357 fprintf(1,'Initial learning rate (alpha) : %-6.1f\n',sS.alpha_ini);
Daniel@0 358 fprintf(1,'Alpha function type (linear/inv) : %s\n',sS.alpha_type);
Daniel@0 359 fprintf(1,'Training length : %d\n',sS.trainlen);
Daniel@0 360 fprintf(1,'When training was done : %s\n',sS.time);
Daniel@0 361
Daniel@0 362 case 'som_norm',
Daniel@0 363
Daniel@0 364 % level 1
Daniel@0 365 fprintf(1,'Struct type : %s\n',sS.type);
Daniel@0 366 fprintf(1,'Normalization method : %s\n',sS.method);
Daniel@0 367 fprintf(1,'Status : %s\n',sS.status);
Daniel@0 368
Daniel@0 369 % level 2
Daniel@0 370 if level>1,
Daniel@0 371 fprintf(1,'Parameters:\n');
Daniel@0 372 sS.params
Daniel@0 373 end
Daniel@0 374
Daniel@0 375 case 'som_grid',
Daniel@0 376
Daniel@0 377 % level 1
Daniel@0 378 fprintf(1,'Struct type : %s\n',sS.type);
Daniel@0 379 if ischar(sS.neigh),
Daniel@0 380 fprintf(1,'Connections : [%d %d], %s, %s\n',...
Daniel@0 381 sS.msize(1),sS.msize(2),sS.neigh,sS.shape);
Daniel@0 382 else
Daniel@0 383 fprintf(1,'Connections : [%d %d] %d lines\n',...
Daniel@0 384 sS.msize(1),sS.msize(2),sum(sS.neigh));
Daniel@0 385 end
Daniel@0 386 fprintf(1,'Line : %s\n',sS.line);
Daniel@0 387 if length(sS.marker)==1,
Daniel@0 388 fprintf(1,'Marker : %s\n',sS.marker);
Daniel@0 389 else
Daniel@0 390 fprintf(1,'Marker : varies\n');
Daniel@0 391 end
Daniel@0 392 fprintf(1,'Surf : ');
Daniel@0 393 if isempty(sS.surf), fprintf(1,'off\n'); else fprintf(1,'on\n'); end
Daniel@0 394 fprintf(1,'Labels : ');
Daniel@0 395 if isempty(sS.label), fprintf(1,'off\n');
Daniel@0 396 else fprintf(1,'on (%d)\n',sS.labelsize); end
Daniel@0 397
Daniel@0 398 end
Daniel@0 399
Daniel@0 400 fprintf(1,'\n');
Daniel@0 401 end
Daniel@0 402
Daniel@0 403 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%