diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_randinit.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_randinit.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,215 @@
+function sMap = som_randinit(D, varargin)
+
+%SOM_RANDINIT Initialize a Self-Organizing Map with random values.
+%
+% sMap = som_randinit(D, [[argID,] value, ...])
+%
+%  sMap = som_randinit(D);
+%  sMap = som_randinit(D,sMap);
+%  sMap = som_randinit(D,'munits',100,'hexa');
+% 
+%  Input and output arguments ([]'s are optional): 
+%    D                 The training data.
+%             (struct) data struct
+%             (matrix) data matrix, size dlen x dim
+%   [argID,   (string) Parameters affecting the map topology are given 
+%    value]   (varies) as argument ID - argument value pairs, listed below.
+%
+%   sMap      (struct) map struct
+%
+% Here are the valid argument IDs and corresponding values. The values 
+% which are unambiguous (marked with '*') can be given without the
+% preceeding argID.
+%  'munits'       (scalar) number of map units
+%  'msize'        (vector) map size
+%  'lattice'     *(string) map lattice: 'hexa' or 'rect'
+%  'shape'       *(string) map shape: 'sheet', 'cyl' or 'toroid'
+%  'topol'       *(struct) topology struct
+%  'som_topol','sTopol'    = 'topol'
+%  'map'         *(struct) map struct
+%  'som_map','sMap'        = 'map'
+%
+% For more help, try 'type som_randinit' or check out online documentation.
+% See also SOM_MAP_STRUCT, SOM_LININIT, SOM_MAKE.
+
+%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% som_randinit
+%
+% PURPOSE
+%
+% Initializes a SOM with random values.
+%
+% SYNTAX
+%
+%  sMap = som_randinit(D)
+%  sMap = som_randinit(D,sMap);
+%  sMap = som_randinit(D,'munits',100,'hexa');
+%
+% DESCRIPTION
+%
+% Initializes a SOM with random values. If necessary, a map struct
+% is created first. For each component (xi), the values are uniformly
+% distributed in the range of [min(xi) max(xi)]. 
+%
+% REQUIRED INPUT ARGUMENTS
+%
+%  D                 The training data.
+%           (struct) Data struct. If this is given, its '.comp_names' and 
+%                    '.comp_norm' fields are copied to the map struct.
+%           (matrix) data matrix, size dlen x dim
+%  
+% 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 valid argument IDs and corresponding values. The values 
+%  which are unambiguous (marked with '*') can be given without the 
+%  preceeding argID.
+%  'dlen'         (scalar) length of the training data
+%  'data'         (matrix) the training data
+%                *(struct) the training data
+%  'munits'       (scalar) number of map units
+%  'msize'        (vector) map size
+%  'lattice'     *(string) map lattice: 'hexa' or 'rect'
+%  'shape'       *(string) map shape: 'sheet', 'cyl' or 'toroid'
+%  'topol'       *(struct) topology struct
+%  'som_topol','sTopol'    = 'topol'
+%  'map'         *(struct) map struct
+%  'som_map','sMap'        = 'map'
+%
+% OUTPUT ARGUMENTS
+% 
+%  sMap     (struct) The initialized map struct.
+%
+% EXAMPLES
+%
+%  sMap = som_randinit(D);
+%  sMap = som_randinit(D,sMap);
+%  sMap = som_randinit(D,sTopol);
+%  sMap = som_randinit(D,'msize',[10 10]);
+%  sMap = som_randinit(D,'munits',100,'hexa');
+%
+% SEE ALSO
+% 
+%  som_map_struct   Create a map struct.
+%  som_lininit      Initialize a map using linear initialization algorithm.
+%  som_make         Initialize and train self-organizing map.
+
+% Copyright (c) 1997-2000 by the SOM toolbox programming team.
+% http://www.cis.hut.fi/projects/somtoolbox/
+
+% Version 1.0beta ecco 100997
+% Version 2.0beta juuso 101199
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% check arguments
+
+% data
+if isstruct(D), 
+  data_name = D.name; 
+  comp_names = D.comp_names; 
+  comp_norm = D.comp_norm; 
+  D = D.data;
+  struct_mode = 1; 
+else 
+  data_name = inputname(1); 
+  struct_mode = 0; 
+end
+[dlen dim] = size(D);
+
+% varargin
+sMap = [];
+sTopol = som_topol_struct; 
+sTopol.msize = 0; 
+munits = NaN;
+i=1; 
+while i<=length(varargin), 
+  argok = 1; 
+  if ischar(varargin{i}), 
+    switch varargin{i}, 
+     case 'munits',     i=i+1; munits = varargin{i}; sTopol.msize = 0;
+     case 'msize',      i=i+1; sTopol.msize = varargin{i};
+                               munits = prod(sTopol.msize); 
+     case 'lattice',    i=i+1; sTopol.lattice = varargin{i}; 
+     case 'shape',      i=i+1; sTopol.shape = varargin{i}; 
+     case {'som_topol','sTopol','topol'}, i=i+1; sTopol = varargin{i}; 
+     case {'som_map','sMap','map'}, i=i+1; sMap = varargin{i}; sTopol = sMap.topol;
+     case {'hexa','rect'},          sTopol.lattice = varargin{i}; 
+     case {'sheet','cyl','toroid'}, sTopol.shape = varargin{i};
+     otherwise argok=0; 
+    end
+  elseif isstruct(varargin{i}) & isfield(varargin{i},'type'), 
+    switch varargin{i}.type, 
+     case 'som_topol',
+      sTopol = varargin{i}; 
+     case 'som_map', 
+      sMap = varargin{i};
+      sTopol = sMap.topol;
+     otherwise argok=0; 
+    end
+  else
+    argok = 0; 
+  end
+  if ~argok, 
+    disp(['(som_topol_struct) Ignoring invalid argument #' num2str(i)]); 
+  end
+  i = i+1; 
+end
+
+if ~isempty(sMap), 
+  [munits dim2] = size(sMap.codebook);
+  if dim2 ~= dim, error('Map and data must have the same dimension.'); end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% create map
+
+% map struct
+if ~isempty(sMap), 
+  sMap = som_set(sMap,'topol',sTopol);
+else  
+  if ~prod(sTopol.msize), 
+    if isnan(munits), 
+      sTopol = som_topol_struct('data',D,sTopol);
+    else
+      sTopol = som_topol_struct('data',D,'munits',munits,sTopol);
+    end
+  end  
+  sMap = som_map_struct(dim, sTopol); 
+end
+
+if struct_mode, 
+  sMap = som_set(sMap,'comp_names',comp_names,'comp_norm',comp_norm);
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% initialization
+
+% train struct
+sTrain = som_train_struct('algorithm','randinit');
+sTrain = som_set(sTrain,'data_name',data_name);
+
+munits = prod(sMap.topol.msize);
+sMap.codebook = rand([munits dim]); 
+
+% set interval of each component to correct value
+for i = 1:dim,
+  inds = find(~isnan(D(:,i)) & ~isinf(D(:,i))); 
+  if isempty(inds), mi = 0; ma = 1; 
+  else ma = max(D(inds,i)); mi = min(D(inds,i));  
+  end
+  sMap.codebook(:,i) = (ma - mi) * sMap.codebook(:,i) + mi; 
+end
+
+% training struct
+sTrain = som_set(sTrain,'time',datestr(now,0));
+sMap.trainhist = sTrain;
+
+return;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ No newline at end of file