Mercurial > hg > camir-aes2014
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_supervised.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,337 @@ +function sM = som_supervised(sData,varargin) + +%SOM_SUPERVISED SOM training which utilizes class information. +% +% sM = som_supervised(sData, [ArgID, value,...])) +% +% Input and output arguments ([]'s are optional) +% sData (struct) data struct, the class information is +% taken from the first column of .labels field +% [argID, (string) See below. These are given as +% value] (varies) 'argID', value -pairs. +% +% sMap (struct) map struct +% +% Here are the argument IDs and corresponding values: +% 'munits' (scalar) the preferred number of map units +% 'msize' (vector) map grid size +% 'mask' (vector) BMU search mask, size dim x 1 +% 'name' (string) map name +% 'comp_names' (string array / cellstr) component names, size dim x 1 +% 'tracking' (scalar) how much to report, default = 1 +% The following values are unambiguous and can therefore +% be given without the preceeding argument ID: +% 'algorithm' (string) training algorithm: 'seq' or 'batch' +% 'mapsize' (string) do you want a 'small', 'normal' or 'big' map +% Any explicit settings of munits or msize override this. +% 'topol' (struct) topology struct +% 'som_topol','sTopol' = 'topol' +% 'lattice' (string) map lattice, 'hexa' or 'rect' +% 'shape' (string) map shape, 'sheet', 'cyl' or 'toroid' +% 'neigh' (string) neighborhood function, 'gaussian', 'cutgauss', +% 'ep' or 'bubble' +% +% For more help, try 'type som_supervised', or check out online documentation. +% See also SOM_MAKE, SOM_AUTOLABEL. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_supervised +% +% PURPOSE +% +% Creates, initializes and trains a supervised SOM by taking the +% class-identity into account. +% +% SYNTAX +% +% sMap = som_supervised(sData); +% sMap = som_supervised(...,'argID',value,...) +% sMap = som_make(...,value,...); +% +% DESCRIPTION +% +% Creates, initializes and trains a supervised SOM. It constructs the +% training data by adding 1-of-N -coded matrix to the original data +% based on the class information in the .labels field. The dimension +% of vectors after the process is (the old dimension + number of +% different classes). In each vector, one of the new components has +% value '1' (this depends on the class of the vector), and others '0'. +% Calls SOM_MAKE to construct the map. Then the class of each map unit +% is determined by taking maximum over these added components, and a +% label is give accordingly. Finally, the extra components (the +% 1-of-N -coded ones) are removed. +% +% REFERENCES +% +% Kohonen, T., "Self-Organizing Map", 2nd ed., Springer-Verlag, +% Berlin, 1995, pp. 160-161. +% Kohonen, T., Mäkivasara, K., Saramäki, T., "Phonetic Maps - +% Insightful Representation of Phonological Features For +% Speech Recognition", In proceedings of International +% Conference on Pattern Recognition (ICPR), Montreal, Canada, +% 1984, pp. 182-185. +% +% REQUIRED INPUT ARGUMENTS +% +% sData The data to use in the training. +% (struct) A data struct. '.comp_names' as well as '.name' +% is copied to the map. The class information is +% taken from the first column of '.labels' field. +% +% OPTIONAL INPUT ARGUMENTS +% +% argID (string) Argument identifier string (see below). +% value (varies) Value for the argument (see below). +% +% The optional arguments can be given as 'argID',value -pairs. If an +% argument is given value multiple times, the last one is used. +% Here are the argument IDs and corresponding values: +% 'munits' (scalar) the preferred number of map units - this may +% change a bit, depending on the properties of the data +% 'msize' (vector) map grid size +% 'mask' (vector) BMU search mask, size dim x 1 +% 'name' (string) map name +% 'comp_names' (string array / cellstr) component names, size dim x 1 +% 'tracking' (scalar) how much to report, default = 1. This parameter +% is also passed to the training functions. +% The following values are unambiguous and can therefore +% be given without the preceeding argument ID: +% 'algorithm' (string) training algorithm: 'seq' or 'batch' (default) +% 'mapsize' (string) do you want a 'small', 'normal' or 'big' map +% Any explicit settings of munits or msize (or topol) +% override this. +% 'topol' (struct) topology struct +% 'som_topol','sTopol' = 'topol' +% 'lattice' (string) map lattice, 'hexa' or 'rect' +% 'shape' (string) map shape, 'sheet', 'cyl' or 'toroid' +% 'neigh' (string) neighborhood function, 'gaussian', 'cutgauss', +% 'ep' or 'bubble' +% +% OUTPUT ARGUMENTS +% +% sMap (struct) SOM -map struct +% +% EXAMPLES +% +% To simply train a map with default parameters: +% +% sMap = som_supervised(sData); +% +% With the optional arguments, the initialization and training can be +% influenced. To change map size, use 'msize', 'munits' or 'mapsize' +% arguments: +% +% sMap = som_supervised(D,'mapsize','big'); or +% sMap = som_supervised(D,'big'); +% sMap = som_supervised(D,'munits', 100); +% sMap = som_supervised(D,'msize', [20 10]); +% +% Argument 'algorithm' can be used to switch between 'seq' and 'batch' +% algorithms. 'batch' is the default, so to use 'seq' algorithm: +% +% sMap = som_supervised(D,'algorithm','seq'); or +% sMap = som_supervised(D,'seq'); +% +% The 'tracking' argument can be used to control the amout of reporting +% during training. The argument is used in this function, and it is +% passed to the training functions. To make the function work silently +% set it to 0. +% +% sMap = som_supervised(D,'tracking',0); +% +% SEE ALSO +% +% som_make Create, initialize and train Self-Organizing map. +% som_autolabel Label SOM/data set based on another SOM/data set. + +% Contributed to SOM Toolbox vs2, Feb 2nd, 2000 by Juha Parhankangas +% Copyright (c) by Juha Parhankangas +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Juha Parhankangas 050100 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +D0 = sData.data; +[c,n,classlabels] = class2num(sData.labels(:,1)); + +%%%%%%%% Checking arguments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +if ~isstruct(sData) + error('Argument ''sData'' must be a ''som_data'' -struct.'); +else + data_name = sData.name; + comp_names = sData.comp_names; + comp_norm = sData.comp_norm; +end + +[dlen,dim] = size(sData.data); + +% defaults + +mapsize = ''; +sM = som_map_struct(dim+n); +sTopol = sM.topol; +munits = prod(sTopol.msize); % should be zero +mask = sM.mask; +name = sM.name; +neigh = sM.neigh; +tracking = 1; +algorithm = 'batch'; + +%%%% changes to defaults (checking varargin) %%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +i=1; +while i <= length(varargin) + argok = 1; + if ischar(varargin{i}) + switch varargin{i}, + % argument IDs + case 'mask', + i=i+1; + mask = varargin{i}; + case 'munits', + i=i+1; + munits = varargin{i}; + case 'msize', + i=i+1; + sTopol.msize = varargin{i}; + munits = prod(sTopol.msize); + case 'mapsize', + i=i+1; + mapsize = varargin{i}; + case 'name', + i=i+1; + name = varargin{i}; + case 'comp_names', + i=i+1; + comp_names = varargin{i}; + case 'lattice', + i=i+1; + sTopol.lattice = varargin{i}; + case 'shape', + i=i+1; + sTopol.shape = varargin{i}; + case {'topol','som_topol','sTopol'}, + i=i+1; + sTopol = varargin{i}; + munits = prod(sTopol.msize); + case 'neigh', + i=i+1; + neigh = varargin{i}; + case 'tracking', + i=i+1; + tracking = varargin{i}; + case 'algorithm', + i=i+1; + algorithm = varargin{i}; + % unambiguous values + case {'hexa','rect'}, + sTopol.lattice = varargin{i}; + case {'sheet','cyl','toroid'}, + sTopol.shape = varargin{i}; + case {'gaussian','cutgauss','ep','bubble'}, + neigh = varargin{i}; + case {'seq','batch'}, + algorithm = varargin{i}; + case {'small','normal','big'}, + mapsize = varargin{i}; + otherwise argok=0; + end + elseif isstruct(varargin{i}) & isfield(varargin{i},'type'), + switch varargin{i}(1).type, + case 'som_topol', + sTopol = varargin{i}; + otherwise argok=0; + end + else + argok = 0; + end + if ~argok, + disp(['(som_supervised) Ignoring invalid argument #' num2str(i+1)]); + end + i = i+1; +end + +%%%%%%%% Action %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +% constructing the training data by adding 1-of-N -coded matrix to the +% original data. + +[dlen,dim] = size(D0); + +Dc = zeros(dlen,n); + +for i=1:dlen + if c(i) + Dc(i,c(i)) = 1; + end +end + +D = [D0, Dc]; + +% initialization and training + +sD = som_data_struct(D,... + 'name',data_name); + +sM = som_make(sD,... + 'mask',mask,... + 'munits',munits,... + 'name',data_name,... + 'tracking',tracking,... + 'algorithm',algorithm,... + 'mapsize',mapsize,... + 'topol',sTopol,... + 'neigh',neigh); + +% add labels + +for i=1:prod(sM.topol.msize), + [dummy,class] = max(sM.codebook(i,dim+[1:n])); + sM.labels{i} = classlabels{class}; +end + +%sD.labels = sData.labels; +%sM = som_autolabel(sM,sD,'vote'); + +% remove extra components and modify map -struct + +sM.codebook = sM.codebook(:,1:dim); +sM.mask = sM.mask(1:dim); +sM.comp_names = sData.comp_names; +sM.comp_norm = sData.comp_norm; + +% remove extras from sM.trainhist + +for i=1:length(sM.trainhist) + if sM.trainhist(i).mask + sM.trainhist(i).mask = sM.trainhist(i).mask(1:dim); + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function [numbers, n, names] = class2num(class) + +names = {}; +numbers = zeros(length(class),1); + +for i=1:length(class) + if ~isempty(class{i}) & ~any(strcmp(class{i},names)) + names=cat(1,names,class(i)); + end +end + +n=length(names); + +tmp_numbers = (1:n)'; + +for i=1:length(class) + if ~isempty(class{i}) + numbers(i,1) = find(strcmp(class{i},names)); + end +end