Mercurial > hg > camir-aes2014
comparison toolboxes/MIRtoolbox1.3.2/somtoolbox/som_supervised.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e9a9cd732c1e |
---|---|
1 function sM = som_supervised(sData,varargin) | |
2 | |
3 %SOM_SUPERVISED SOM training which utilizes class information. | |
4 % | |
5 % sM = som_supervised(sData, [ArgID, value,...])) | |
6 % | |
7 % Input and output arguments ([]'s are optional) | |
8 % sData (struct) data struct, the class information is | |
9 % taken from the first column of .labels field | |
10 % [argID, (string) See below. These are given as | |
11 % value] (varies) 'argID', value -pairs. | |
12 % | |
13 % sMap (struct) map struct | |
14 % | |
15 % Here are the argument IDs and corresponding values: | |
16 % 'munits' (scalar) the preferred number of map units | |
17 % 'msize' (vector) map grid size | |
18 % 'mask' (vector) BMU search mask, size dim x 1 | |
19 % 'name' (string) map name | |
20 % 'comp_names' (string array / cellstr) component names, size dim x 1 | |
21 % 'tracking' (scalar) how much to report, default = 1 | |
22 % The following values are unambiguous and can therefore | |
23 % be given without the preceeding argument ID: | |
24 % 'algorithm' (string) training algorithm: 'seq' or 'batch' | |
25 % 'mapsize' (string) do you want a 'small', 'normal' or 'big' map | |
26 % Any explicit settings of munits or msize override this. | |
27 % 'topol' (struct) topology struct | |
28 % 'som_topol','sTopol' = 'topol' | |
29 % 'lattice' (string) map lattice, 'hexa' or 'rect' | |
30 % 'shape' (string) map shape, 'sheet', 'cyl' or 'toroid' | |
31 % 'neigh' (string) neighborhood function, 'gaussian', 'cutgauss', | |
32 % 'ep' or 'bubble' | |
33 % | |
34 % For more help, try 'type som_supervised', or check out online documentation. | |
35 % See also SOM_MAKE, SOM_AUTOLABEL. | |
36 | |
37 %%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
38 % | |
39 % som_supervised | |
40 % | |
41 % PURPOSE | |
42 % | |
43 % Creates, initializes and trains a supervised SOM by taking the | |
44 % class-identity into account. | |
45 % | |
46 % SYNTAX | |
47 % | |
48 % sMap = som_supervised(sData); | |
49 % sMap = som_supervised(...,'argID',value,...) | |
50 % sMap = som_make(...,value,...); | |
51 % | |
52 % DESCRIPTION | |
53 % | |
54 % Creates, initializes and trains a supervised SOM. It constructs the | |
55 % training data by adding 1-of-N -coded matrix to the original data | |
56 % based on the class information in the .labels field. The dimension | |
57 % of vectors after the process is (the old dimension + number of | |
58 % different classes). In each vector, one of the new components has | |
59 % value '1' (this depends on the class of the vector), and others '0'. | |
60 % Calls SOM_MAKE to construct the map. Then the class of each map unit | |
61 % is determined by taking maximum over these added components, and a | |
62 % label is give accordingly. Finally, the extra components (the | |
63 % 1-of-N -coded ones) are removed. | |
64 % | |
65 % REFERENCES | |
66 % | |
67 % Kohonen, T., "Self-Organizing Map", 2nd ed., Springer-Verlag, | |
68 % Berlin, 1995, pp. 160-161. | |
69 % Kohonen, T., Mäkivasara, K., Saramäki, T., "Phonetic Maps - | |
70 % Insightful Representation of Phonological Features For | |
71 % Speech Recognition", In proceedings of International | |
72 % Conference on Pattern Recognition (ICPR), Montreal, Canada, | |
73 % 1984, pp. 182-185. | |
74 % | |
75 % REQUIRED INPUT ARGUMENTS | |
76 % | |
77 % sData The data to use in the training. | |
78 % (struct) A data struct. '.comp_names' as well as '.name' | |
79 % is copied to the map. The class information is | |
80 % taken from the first column of '.labels' field. | |
81 % | |
82 % OPTIONAL INPUT ARGUMENTS | |
83 % | |
84 % argID (string) Argument identifier string (see below). | |
85 % value (varies) Value for the argument (see below). | |
86 % | |
87 % The optional arguments can be given as 'argID',value -pairs. If an | |
88 % argument is given value multiple times, the last one is used. | |
89 % Here are the argument IDs and corresponding values: | |
90 % 'munits' (scalar) the preferred number of map units - this may | |
91 % change a bit, depending on the properties of the data | |
92 % 'msize' (vector) map grid size | |
93 % 'mask' (vector) BMU search mask, size dim x 1 | |
94 % 'name' (string) map name | |
95 % 'comp_names' (string array / cellstr) component names, size dim x 1 | |
96 % 'tracking' (scalar) how much to report, default = 1. This parameter | |
97 % is also passed to the training functions. | |
98 % The following values are unambiguous and can therefore | |
99 % be given without the preceeding argument ID: | |
100 % 'algorithm' (string) training algorithm: 'seq' or 'batch' (default) | |
101 % 'mapsize' (string) do you want a 'small', 'normal' or 'big' map | |
102 % Any explicit settings of munits or msize (or topol) | |
103 % override this. | |
104 % 'topol' (struct) topology struct | |
105 % 'som_topol','sTopol' = 'topol' | |
106 % 'lattice' (string) map lattice, 'hexa' or 'rect' | |
107 % 'shape' (string) map shape, 'sheet', 'cyl' or 'toroid' | |
108 % 'neigh' (string) neighborhood function, 'gaussian', 'cutgauss', | |
109 % 'ep' or 'bubble' | |
110 % | |
111 % OUTPUT ARGUMENTS | |
112 % | |
113 % sMap (struct) SOM -map struct | |
114 % | |
115 % EXAMPLES | |
116 % | |
117 % To simply train a map with default parameters: | |
118 % | |
119 % sMap = som_supervised(sData); | |
120 % | |
121 % With the optional arguments, the initialization and training can be | |
122 % influenced. To change map size, use 'msize', 'munits' or 'mapsize' | |
123 % arguments: | |
124 % | |
125 % sMap = som_supervised(D,'mapsize','big'); or | |
126 % sMap = som_supervised(D,'big'); | |
127 % sMap = som_supervised(D,'munits', 100); | |
128 % sMap = som_supervised(D,'msize', [20 10]); | |
129 % | |
130 % Argument 'algorithm' can be used to switch between 'seq' and 'batch' | |
131 % algorithms. 'batch' is the default, so to use 'seq' algorithm: | |
132 % | |
133 % sMap = som_supervised(D,'algorithm','seq'); or | |
134 % sMap = som_supervised(D,'seq'); | |
135 % | |
136 % The 'tracking' argument can be used to control the amout of reporting | |
137 % during training. The argument is used in this function, and it is | |
138 % passed to the training functions. To make the function work silently | |
139 % set it to 0. | |
140 % | |
141 % sMap = som_supervised(D,'tracking',0); | |
142 % | |
143 % SEE ALSO | |
144 % | |
145 % som_make Create, initialize and train Self-Organizing map. | |
146 % som_autolabel Label SOM/data set based on another SOM/data set. | |
147 | |
148 % Contributed to SOM Toolbox vs2, Feb 2nd, 2000 by Juha Parhankangas | |
149 % Copyright (c) by Juha Parhankangas | |
150 % http://www.cis.hut.fi/projects/somtoolbox/ | |
151 | |
152 % Juha Parhankangas 050100 | |
153 | |
154 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
155 | |
156 D0 = sData.data; | |
157 [c,n,classlabels] = class2num(sData.labels(:,1)); | |
158 | |
159 %%%%%%%% Checking arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
160 | |
161 if ~isstruct(sData) | |
162 error('Argument ''sData'' must be a ''som_data'' -struct.'); | |
163 else | |
164 data_name = sData.name; | |
165 comp_names = sData.comp_names; | |
166 comp_norm = sData.comp_norm; | |
167 end | |
168 | |
169 [dlen,dim] = size(sData.data); | |
170 | |
171 % defaults | |
172 | |
173 mapsize = ''; | |
174 sM = som_map_struct(dim+n); | |
175 sTopol = sM.topol; | |
176 munits = prod(sTopol.msize); % should be zero | |
177 mask = sM.mask; | |
178 name = sM.name; | |
179 neigh = sM.neigh; | |
180 tracking = 1; | |
181 algorithm = 'batch'; | |
182 | |
183 %%%% changes to defaults (checking varargin) %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
184 | |
185 i=1; | |
186 while i <= length(varargin) | |
187 argok = 1; | |
188 if ischar(varargin{i}) | |
189 switch varargin{i}, | |
190 % argument IDs | |
191 case 'mask', | |
192 i=i+1; | |
193 mask = varargin{i}; | |
194 case 'munits', | |
195 i=i+1; | |
196 munits = varargin{i}; | |
197 case 'msize', | |
198 i=i+1; | |
199 sTopol.msize = varargin{i}; | |
200 munits = prod(sTopol.msize); | |
201 case 'mapsize', | |
202 i=i+1; | |
203 mapsize = varargin{i}; | |
204 case 'name', | |
205 i=i+1; | |
206 name = varargin{i}; | |
207 case 'comp_names', | |
208 i=i+1; | |
209 comp_names = varargin{i}; | |
210 case 'lattice', | |
211 i=i+1; | |
212 sTopol.lattice = varargin{i}; | |
213 case 'shape', | |
214 i=i+1; | |
215 sTopol.shape = varargin{i}; | |
216 case {'topol','som_topol','sTopol'}, | |
217 i=i+1; | |
218 sTopol = varargin{i}; | |
219 munits = prod(sTopol.msize); | |
220 case 'neigh', | |
221 i=i+1; | |
222 neigh = varargin{i}; | |
223 case 'tracking', | |
224 i=i+1; | |
225 tracking = varargin{i}; | |
226 case 'algorithm', | |
227 i=i+1; | |
228 algorithm = varargin{i}; | |
229 % unambiguous values | |
230 case {'hexa','rect'}, | |
231 sTopol.lattice = varargin{i}; | |
232 case {'sheet','cyl','toroid'}, | |
233 sTopol.shape = varargin{i}; | |
234 case {'gaussian','cutgauss','ep','bubble'}, | |
235 neigh = varargin{i}; | |
236 case {'seq','batch'}, | |
237 algorithm = varargin{i}; | |
238 case {'small','normal','big'}, | |
239 mapsize = varargin{i}; | |
240 otherwise argok=0; | |
241 end | |
242 elseif isstruct(varargin{i}) & isfield(varargin{i},'type'), | |
243 switch varargin{i}(1).type, | |
244 case 'som_topol', | |
245 sTopol = varargin{i}; | |
246 otherwise argok=0; | |
247 end | |
248 else | |
249 argok = 0; | |
250 end | |
251 if ~argok, | |
252 disp(['(som_supervised) Ignoring invalid argument #' num2str(i+1)]); | |
253 end | |
254 i = i+1; | |
255 end | |
256 | |
257 %%%%%%%% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
258 | |
259 | |
260 | |
261 % constructing the training data by adding 1-of-N -coded matrix to the | |
262 % original data. | |
263 | |
264 [dlen,dim] = size(D0); | |
265 | |
266 Dc = zeros(dlen,n); | |
267 | |
268 for i=1:dlen | |
269 if c(i) | |
270 Dc(i,c(i)) = 1; | |
271 end | |
272 end | |
273 | |
274 D = [D0, Dc]; | |
275 | |
276 % initialization and training | |
277 | |
278 sD = som_data_struct(D,... | |
279 'name',data_name); | |
280 | |
281 sM = som_make(sD,... | |
282 'mask',mask,... | |
283 'munits',munits,... | |
284 'name',data_name,... | |
285 'tracking',tracking,... | |
286 'algorithm',algorithm,... | |
287 'mapsize',mapsize,... | |
288 'topol',sTopol,... | |
289 'neigh',neigh); | |
290 | |
291 % add labels | |
292 | |
293 for i=1:prod(sM.topol.msize), | |
294 [dummy,class] = max(sM.codebook(i,dim+[1:n])); | |
295 sM.labels{i} = classlabels{class}; | |
296 end | |
297 | |
298 %sD.labels = sData.labels; | |
299 %sM = som_autolabel(sM,sD,'vote'); | |
300 | |
301 % remove extra components and modify map -struct | |
302 | |
303 sM.codebook = sM.codebook(:,1:dim); | |
304 sM.mask = sM.mask(1:dim); | |
305 sM.comp_names = sData.comp_names; | |
306 sM.comp_norm = sData.comp_norm; | |
307 | |
308 % remove extras from sM.trainhist | |
309 | |
310 for i=1:length(sM.trainhist) | |
311 if sM.trainhist(i).mask | |
312 sM.trainhist(i).mask = sM.trainhist(i).mask(1:dim); | |
313 end | |
314 end | |
315 | |
316 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
317 | |
318 function [numbers, n, names] = class2num(class) | |
319 | |
320 names = {}; | |
321 numbers = zeros(length(class),1); | |
322 | |
323 for i=1:length(class) | |
324 if ~isempty(class{i}) & ~any(strcmp(class{i},names)) | |
325 names=cat(1,names,class(i)); | |
326 end | |
327 end | |
328 | |
329 n=length(names); | |
330 | |
331 tmp_numbers = (1:n)'; | |
332 | |
333 for i=1:length(class) | |
334 if ~isempty(class{i}) | |
335 numbers(i,1) = find(strcmp(class{i},names)); | |
336 end | |
337 end |