diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_info.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_info.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,403 @@
+function som_info(sS,level)
+
+%SOM_INFO Displays information on the given SOM Toolbox struct.
+% 
+% som_info(sS,[level])
+%
+%  som_info(sMap);
+%  som_info(sData,3);
+%  som_info({sMap,sData});
+%  som_info(sMap.comp_norm{2}); 
+%
+%  Input and output arguments ([]'s are optional): 
+%   sS       (struct) SOM Toolbox struct 
+%            (cell array of structs) several structs in a cell array
+%   [level]  (scalar) detail level (1-4), default = 1
+%
+% For more help, try 'type som_info' or check out online documentation.
+% See also SOM_SET.
+
+%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% som_info
+%
+% PURPOSE
+%
+% Display information of the given SOM Toolbox struct(s).
+%
+% SYNTAX
+%
+%  som_info(sM)
+%  som_info({sM,sD})
+%  som_info(...,level)
+%
+% DESCRIPTION
+%
+% Display the contents of the given SOM Toolbox struct(s). Information
+% of several structs can be shown if the structs are given in a cell 
+% array. The level of detail can be varied with the second argument.
+% The number of different levels varies between structs. For map and 
+% data structs, not only the fields, but also some statistics of the 
+% vectors ('.data' and '.codebook' fields) is displayed. 
+%
+%   map struct
+%    level 1: name, dimension, topology, dimension, neigborhood function,
+%             mask and training status
+%    level 2: ..., training history
+%    level 3: ..., vector component names, statistics and normalization status
+%    level 4: ..., vector component normalizations
+%
+%   data struct:
+%    level 1: name, dimension, data set completeness statistics
+%    level 2: ..., vector component names, statistics and normalization status
+%    level 3: ..., vector component normalizations
+%    level 4: ..., label statistics
+%    
+%   topology struct: 
+%    level 1: all fields
+%
+%   train struct: 
+%    level 1: all fields
+%
+%   normalization struct: 
+%    level 1: method, status
+%    level 2: ..., parameters
+%    
+% REQUIRED INPUT ARGUMENTS
+%
+%   sS       (struct) SOM Toolbox struct 
+%            (cell array of structs) several structs in a cell array
+%  
+% OPTIONAL INPUT ARGUMENTS 
+%
+%   level    (scalar) detail level (1-4), default = 1
+%
+% EXAMPLES
+%
+%  som_info(sM)
+%  som_info(sM,4)
+%  som_info(sM.trainhist)
+%  som_info(sM.comp_norm{3})
+%
+% SEE ALSO
+% 
+%  som_set        Set fields and create SOM Toolbox structs.
+
+% Copyright (c) 1999-2000 by the SOM toolbox programming team.
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% Version 1.0beta ecco 110997
+% Version 2.0beta juuso 101199
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% check arguments
+
+error(nargchk(1, 2, nargin))  % check no. of input args is correct
+
+if ~isstruct(sS),
+  if ~iscell(sS) | ~isstruct(sS{1}), 
+    error('Invalid first input argument.')
+  end
+  csS = sS;
+else
+  l = length(sS);   
+  csS = cell(l,1); 
+  for i=1:l, csS{i} = sS(i); end
+end
+
+if nargin<2 | isempty(level) | isnan(level), level = 1; end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% print struct information
+
+for c=1:length(csS), 
+ sS = csS{c};
+ fprintf(1,'\n');
+ 
+ switch sS.type, 
+ case 'som_map', 
+  mdim = length(sS.topol.msize);
+  [munits dim] = size(sS.codebook);
+  t    = length(sS.trainhist);  
+  if t==0, st='uninitialized'; 
+  elseif t==1, st = 'initialized';
+  else st = sprintf('initialized, trained %d times',t-1);
+  end
+
+  % level 1
+  fprintf(1,'Struct type                           : %s\n', sS.type);
+  fprintf(1,'Map name                              : %s\n', sS.name);
+  fprintf(1,'Input dimension                       : %d\n', dim);
+  fprintf(1,'Map grid size                         : ');
+  for i = 1:mdim - 1, fprintf(1,'%d x ',sS.topol.msize(i)); end
+  fprintf(1,'%d\n', sS.topol.msize(mdim));
+  fprintf(1,'Lattice type (rect/hexa)              : %s\n', sS.topol.lattice);
+  fprintf(1,'Shape (sheet/cyl/toroid)              : %s\n', sS.topol.shape);
+  fprintf(1,'Neighborhood type                     : %s\n', sS.neigh);
+  fprintf(1,'Mask                                  : ');
+  if dim,
+    for i = 1:dim-1, fprintf(1,'%d ',sS.mask(i)); end; 
+    fprintf(1,'%d\n',sS.mask(dim));
+  else fprintf(1,'\n');
+  end
+  fprintf(1,'Training status                       : %s\n', st);
+   
+  % level 1,
+  status = cell(dim,1);
+  for i=1:dim, 
+    n = length(sS.comp_norm{i});
+    if n, 
+      uninit = strcmp('uninit',{sS.comp_norm{i}.status});
+      done   = strcmp('done',{sS.comp_norm{i}.status});
+      undone = strcmp('undone',{sS.comp_norm{i}.status});
+      if sum(uninit)==n, status{i} = 'none';
+      elseif sum(done)==n, status{i} = 'done';
+      elseif sum(undone)==n, status{i} = 'undone';
+      else status{i} = 'partial';
+      end
+    else status{i} = 'no normalization'; end
+  end
+  if level>1, 
+    fprintf(1,'\nVector components\n');
+    M = sS.codebook;
+    fprintf(1,' #   name          mask     min    mean     max     std  normalization\n');
+    fprintf(1,' --- ------------  ----  ------  ------  ------  ------  -------------\n');
+    for i = 1:dim,
+      fprintf(1,' %-3d %-12s  %-4.2f  %6.2g  %6.2g  %6.2g  %6.2g  %s\n', ...
+              i,sS.comp_names{i}, sS.mask(i), ...
+              min(M(:,i)),mean(M(:,i)),max(M(:,i)),std(M(:,i)),status{i});
+    end
+  end
+
+  % level 3
+  if level>2,
+    fprintf(1,'\nVector component normalizations\n');
+    fprintf(1,' #   name          method (i=uninit,u=undone,d=done)\n');
+    fprintf(1,' --- ------------  ---------------------------------------\n');
+    for i=1:dim,  
+      fprintf(1,' %-3d %-12s  ',i,sS.comp_names{i});
+      n = length(sS.comp_norm{i}); 
+      for j=1:n, 
+        m = sS.comp_norm{i}(j).method;
+        s = sS.comp_norm{i}(j).status;
+        if strcmp(s,'uninit'), c='i'; 
+        elseif strcmp(s,'undone'), c='u'; 
+        else c='d';
+        end
+        fprintf(1,'%s[%s] ',m,c);
+      end
+      fprintf(1,'\n');
+    end
+  end
+  
+  % level 4
+  if level>3,
+    fprintf(1,'\nTraining history\n');
+    fprintf(1,'Algorithm Data          Trainlen Neigh.f. Radius     Alpha (type)   Date\n');
+    fprintf(1,'--------- ------------- -------- -------- ---------- -------------- --------------------\n');	       
+    for i=1:t, 
+      sT = sS.trainhist(i);
+      fprintf(1,'%8s  %13s %8d %8s %4.2f->%4.2f %5.3f (%6s) %s\n',...
+	      sT.algorithm,sT.data_name,sT.trainlen,...
+	      sT.neigh,sT.radius_ini,sT.radius_fin,sT.alpha_ini,sT.alpha_type,sT.time);      
+      %for j = 1:length(sT.mask)-1, fprintf(1,'%d ',sT.mask(j)); end; 
+      %if ~isempty(sT.mask), fprintf(1,'%d\n',sT.mask(end)); else fprintf(1,'\n'); end
+    end
+  end
+
+ case 'som_data',
+
+  [dlen dim] = size(sS.data);
+  if dlen*dim
+    if dim>1, ind = find(~isnan(sum(sS.data,2)));
+    else ind = find(~isnan(sS.data));
+    end
+  else ind = []; end
+  complete = size(sS.data(ind,:),1);
+  partial  = dlen - complete;
+  values   = prod(size(sS.data));
+  missing  = sum(sum(isnan(sS.data))); 
+
+  % level 1  
+  fprintf(1,'Struct type             : %s\n', sS.type);
+  fprintf(1,'Data name               : %s\n', sS.name);
+  fprintf(1,'Vector dimension        : %d\n', dim);
+  fprintf(1,'Number of data vectors  : %d\n', dlen);
+  fprintf(1,'Complete data vectors   : %d\n', complete);
+  fprintf(1,'Partial data vectors    : %d\n', partial);  
+  if values, r = floor(100 * (values - missing) / values); else r = 0; end
+  fprintf(1,'Complete values         : %d of %d (%d%%)\n', ...
+          values-missing, values, r); 
+
+  % level 2,
+  status = cell(dim,1);
+  for i=1:dim, 
+    n = length(sS.comp_norm{i});
+    if n, 
+      uninit = strcmp('uninit',{sS.comp_norm{i}.status});
+      done   = strcmp('done',{sS.comp_norm{i}.status});
+      undone = strcmp('undone',{sS.comp_norm{i}.status});
+      if sum(uninit)==n, status{i} = 'none';
+      elseif sum(done)==n, status{i} = 'done';
+      elseif sum(undone)==n, status{i} = 'undone';
+      else status{i} = 'partial';
+      end
+    else status{i} = 'no normalization'; end
+  end
+  if level>1, 
+    fprintf(1,'\nVector components\n');
+    D = sS.data;
+    fprintf(1,' #   name            min     mean     max     std  missing      normalization\n');
+    fprintf(1,' --- ------------  ------  ------  ------  ------  -----------  -------------\n');
+    for i = 1:dim,
+      known = find(~isnan(D(:,i))); 
+      miss = dlen-length(known);
+      switch length(known), 
+       case 0, mi = NaN; me = NaN; ma = NaN; st = NaN; 
+       case 1, mi = D(known,i); me = mi; ma = mi; st = 0;
+       otherwise, 
+	mi = min(D(known,i)); ma = max(D(known,i)); 
+	me = mean(D(known,i)); st = std(D(known,i)); 
+      end
+      fprintf(1,' %-3d %-12s  %6.2g  %6.2g  %6.2g  %6.2g  %5d (%2d%%)  %s\n', ...
+              i,sS.comp_names{i},mi,me,ma,st,miss,floor(100*miss/dlen),status{i});
+    end
+  end
+
+  % level 3
+  if level>2,
+    fprintf(1,'\nVector component normalizations\n');
+    fprintf(1,' #   name          method (i=uninit,u=undone,d=done)\n');
+    fprintf(1,' --- ------------  ---------------------------------------\n');
+    for i=1:dim,  
+      fprintf(1,' %-3d %-12s  ',i,sS.comp_names{i});
+      n = length(sS.comp_norm{i});         
+      for j=1:n, 
+        m = sS.comp_norm{i}(j).method;
+        s = sS.comp_norm{i}(j).status;
+        if strcmp(s,'uninit'), c='i'; 
+        elseif strcmp(s,'undone'), c='u'; 
+        else c='d';
+        end
+        fprintf(1,'%s[%s] ',m,c);
+      end
+      fprintf(1,'\n');
+    end
+  end
+
+  % level 4
+  if level>3,
+    m = size(sS.labels,2);
+    fprintf(1,'\nLabels\n');   
+    if isempty(sS.label_names),       
+      labs = {''}; freq = 0; 
+      for i=1:dlen*m, 
+	l = sS.labels{i}; 
+	if isempty(l), freq(1) = freq(1)+1; 
+	else 
+	  k = find(strcmp(labs,l)); 
+	  if isempty(k), labs{end+1} = l; freq(end+1) = 1; 
+	  else freq(k)=freq(k)+1;
+	  end
+	end
+      end
+      emp = freq(1); 
+      uni = length(freq)-1;
+      if uni>0, tot = sum(freq(2:end)); else tot = 0; end
+      fprintf(1,' Total: %d\n Empty: %d\n Unique: %d\n',tot,emp,uni);
+    else
+      for j=1:m, 
+	labs = {''}; freq = 0; 
+	for i=1:dlen, 
+	  l = sS.labels{i,j}; 
+	  if isempty(l), freq(1) = freq(1)+1; 
+	  else 
+	    k = find(strcmp(labs,l)); 
+	    if isempty(k), labs{end+1} = l; freq(end+1) = 1; 
+	    else freq(k)=freq(k)+1;
+	    end
+	  end
+	end
+	emp = freq(1); 
+	uni = length(freq)-1;
+	if uni>0, tot = sum(freq(2:end)); else tot = 0; end
+	fprintf(1,' [%s] Total / empty / unique: %d / %d / %d\n', ...
+		sS.label_names{j},tot,emp,uni); 
+      end
+    end
+  end
+  
+ case 'som_topol', 
+
+  mdim = length(sS.msize);
+ 
+  % level 1
+  fprintf(1,'Struct type                           : %s\n',sS.type);
+  fprintf(1,'Map grid size                         : ');
+  for i = 1:mdim - 1, fprintf(1,'%d x ',sS.msize(i)); end
+  fprintf(1,'%d\n', sS.msize(mdim));
+  fprintf(1,'Lattice type (rect/hexa)              : %s\n', sS.lattice);
+  fprintf(1,'Shape (sheet/cyl/toroid)              : %s\n', sS.shape);
+
+ case 'som_train', 
+
+  % level 1
+  fprintf(1,'Struct type                           : %s\n',sS.type);
+  fprintf(1,'Training algorithm                    : %s\n',sS.algorithm);
+  fprintf(1,'Training data                         : %s\n',sS.data_name);
+  fprintf(1,'Neighborhood function                 : %s\n',sS.neigh);
+  fprintf(1,'Mask                                  : ');
+  dim = length(sS.mask);
+  if dim, 
+    for i = 1:dim-1, fprintf(1,'%d ',sS.mask(i)); end; 
+    fprintf(1,'%d\n',sS.mask(end));
+  else fprintf(1,'\n'); end
+  fprintf(1,'Initial radius                        : %-6.1f\n',sS.radius_ini);
+  fprintf(1,'Final radius                          : %-6.1f\n',sS.radius_fin);
+  fprintf(1,'Initial learning rate (alpha)         : %-6.1f\n',sS.alpha_ini);
+  fprintf(1,'Alpha function type (linear/inv)      : %s\n',sS.alpha_type);
+  fprintf(1,'Training length                       : %d\n',sS.trainlen);
+  fprintf(1,'When training was done                : %s\n',sS.time);
+
+  case 'som_norm', 
+   
+   % level 1
+   fprintf(1,'Struct type                           : %s\n',sS.type);
+   fprintf(1,'Normalization method                  : %s\n',sS.method);
+   fprintf(1,'Status                                : %s\n',sS.status);
+   
+   % level 2
+   if level>1, 
+     fprintf(1,'Parameters:\n');
+     sS.params
+   end
+   
+  case 'som_grid', 
+   
+   % level 1
+   fprintf(1,'Struct type                           : %s\n',sS.type);
+   if ischar(sS.neigh), 
+     fprintf(1,'Connections                           : [%d %d], %s, %s\n',...
+	     sS.msize(1),sS.msize(2),sS.neigh,sS.shape);
+   else
+     fprintf(1,'Connections                           : [%d %d] %d lines\n',...
+	     sS.msize(1),sS.msize(2),sum(sS.neigh));
+   end
+   fprintf(1,'Line                                  : %s\n',sS.line);
+   if length(sS.marker)==1, 
+     fprintf(1,'Marker                                : %s\n',sS.marker);
+   else
+     fprintf(1,'Marker                                : varies\n');
+   end
+   fprintf(1,'Surf                                  : ');
+   if isempty(sS.surf), fprintf(1,'off\n'); else fprintf(1,'on\n'); end
+   fprintf(1,'Labels                                : ');
+   if isempty(sS.label), fprintf(1,'off\n'); 
+   else fprintf(1,'on (%d)\n',sS.labelsize); end
+   
+ end
+
+ fprintf(1,'\n');
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%