Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_lininit.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_lininit.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,285 @@ +function sMap = som_lininit(D, varargin) + +%SOM_LININIT Initialize a Self-Organizing Map linearly. +% +% sMap = som_lininit(D, [[argID,] value, ...]) +% +% sMap = som_lininit(D); +% sMap = som_lininit(D,sMap); +% sMap = som_lininit(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_lininit' or check out online documentation. +% See also SOM_MAP_STRUCT, SOM_RANDINIT, SOM_MAKE. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_lininit +% +% PURPOSE +% +% Initializes a SOM linearly along its greatest eigenvectors. +% +% SYNTAX +% +% sMap = som_lininit(D); +% sMap = som_lininit(D,sMap); +% sMap = som_lininit(D,'munits',100,'hexa'); +% +% DESCRIPTION +% +% Initializes a SOM linearly. If necessary, a map struct is created +% first. The initialization is made by first calculating the eigenvalues +% and eigenvectors of the training data. Then, the map is initialized +% along the mdim greatest eigenvectors of the training data, where +% mdim is the dimension of the map grid. +% +% REFERENCES +% +% Kohonen, T., "Self-Organizing Map", 2nd ed., Springer-Verlag, +% Berlin, 1995, pp. 106-107. +% +% 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_lininit(D); +% sMap = som_lininit(D,sMap); +% sMap = som_lininit(D,'msize',[10 10]); +% sMap = som_lininit(D,'munits',100,'rect'); +% +% SEE ALSO +% +% som_map_struct Create a map struct. +% som_randinit Initialize a map with random values. +% 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 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 length(sTopol.msize)==1, sTopol.msize = [sTopol.msize 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','lininit'); +sTrain = som_set(sTrain,'data_name',data_name); + +msize = sMap.topol.msize; +mdim = length(msize); +munits = prod(msize); + +[dlen dim] = size(D); +if dlen<2, + %if dlen==1, sMap.codebook = (sMap.codebook - 0.5)*diag(D); end + error(['Linear map initialization requires at least two NaN-free' ... + ' samples.']); + return; +end + +% compute principle components +if dim > 1 & sum(msize > 1) > 1, + % calculate mdim largest eigenvalues and their corresponding + % eigenvectors + + % autocorrelation matrix + A = zeros(dim); + me = zeros(1,dim); + for i=1:dim, + me(i) = mean(D(isfinite(D(:,i)),i)); + D(:,i) = D(:,i) - me(i); + end + for i=1:dim, + for j=i:dim, + c = D(:,i).*D(:,j); c = c(isfinite(c)); + A(i,j) = sum(c)/length(c); A(j,i) = A(i,j); + end + end + + % take mdim first eigenvectors with the greatest eigenvalues + [V,S] = eig(A); + eigval = diag(S); + [y,ind] = sort(eigval); + eigval = eigval(flipud(ind)); + V = V(:,flipud(ind)); + V = V(:,1:mdim); + eigval = eigval(1:mdim); + + % normalize eigenvectors to unit length and multiply them by + % corresponding (square-root-of-)eigenvalues + for i=1:mdim, V(:,i) = (V(:,i) / norm(V(:,i))) * sqrt(eigval(i)); end + +else + + me = zeros(1,dim); + V = zeros(1,dim); + for i=1:dim, + inds = find(~isnan(D(:,i))); + me(i) = mean(D(inds,i),1); + V(i) = std(D(inds,i),1); + end + +end + +% initialize codebook vectors +if dim>1, + sMap.codebook = me(ones(munits,1),:); + Coords = som_unit_coords(msize,'rect','sheet'); + cox = Coords(:,1); Coords(:,1) = Coords(:,2); Coords(:,2) = cox; + for i=1:mdim, + ma = max(Coords(:,i)); mi = min(Coords(:,i)); + if ma>mi, Coords(:,i) = (Coords(:,i)-mi)/(ma-mi); else Coords(:,i) = 0.5; end + end + Coords = (Coords-0.5)*2; + for n = 1:munits, + for d = 1:mdim, + sMap.codebook(n,:) = sMap.codebook(n,:)+Coords(n,d)*V(:, d)'; + end + end +else + sMap.codebook = [0:(munits-1)]'/(munits-1)*(max(D)-min(D))+min(D); +end + +% training struct +sTrain = som_set(sTrain,'time',datestr(now,0)); +sMap.trainhist = sTrain; + +return; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%