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