Browse code

starting som prediction fine-tuned class-performance visualisation

git-svn-id: https://svn.discofish.de/MATLAB/spmtoolbox/SVMCrossVal@112 83ab2cfd-5345-466c-8aeb-2b2739fb922d

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