Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_normalize.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_normalize.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,319 @@ +function sD = som_normalize(sD,method,comps) + +%SOM_NORMALIZE (Re)normalize data or add new normalizations. +% +% sS = som_normalize(sS,[method],[comps]) +% +% sS = som_normalize(sD) +% sS = som_normalize(sS,sNorm) +% D = som_normalize(D,'var') +% sS = som_normalize(sS,'histC',[1:3 10]) +% +% Input and output arguments ([]'s are optional): +% sS The data to which the normalization is applied. +% The modified and updated data is returned. +% (struct) data or map struct +% (matrix) data matrix (a matrix is also returned) +% [method] The normalization method(s) to add/use. If missing, +% or an empty variable ('') is given, the +% normalizations in sS are used. +% (string) identifier for a normalization method to be added: +% 'var', 'range', 'log', 'logistic', 'histD' or 'histC'. +% (struct) Normalization struct, or an array of such. +% Alternatively, a map/data struct can be given +% in which case its '.comp_norm' field is used +% (see below). +% (cell array) Of normalization structs. Typically, the +% '.comp_norm' field of a map/data struct. The +% length of the array must be equal to data dimension. +% (cellstr array) norm and denorm operations in a cellstr array +% which are evaluated with EVAL command with variable +% name 'x' reserved for the variable. +% [comps] (vector) the components to which the normalization is +% applied, default is [1:dim] ie. all components +% +% For more help, try 'type som_normalize' or check out online documentation. +% See also SOM_DENORMALIZE, SOM_NORM_VARIABLE, SOM_INFO. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_normalize +% +% PURPOSE +% +% Add/apply/redo normalization on data structs/sets. +% +% SYNTAX +% +% sS = som_normalize(sS) +% sS = som_normalize(sS,method) +% D = som_normalize(D,sNorm) +% sS = som_normalize(sS,csNorm) +% sS = som_normalize(...,comps) +% +% DESCRIPTION +% +% This function is used to (initialize and) add, redo and apply +% normalizations on data/map structs/sets. If a data/map struct is given, +% the specified normalizations are added to the '.comp_norm' field of the +% struct after ensuring that all normalizations specified therein have +% status 'done'. SOM_NORMALIZE actually uses function SOM_NORM_VARIABLE +% to handle the normalization operations, and only handles the data +% struct/set specific stuff itself. +% +% The different normalization methods are listed below. For more +% detailed descriptions, see SOM_NORM_VARIABLE. +% +% method description +% 'var' Variance is normalized to one (linear operation). +% 'range' Values are normalized between [0,1] (linear operation). +% 'log' Natural logarithm is applied to the values: +% xnew = log(x-m+1) +% where m = min(x). +% 'logistic' Logistic or softmax trasformation which scales all +% possible values between [0,1]. +% 'histD' Histogram equalization, values scaled between [0,1]. +% 'histC' Approximate histogram equalization with partially +% linear operations. Values scaled between [0,1]. +% 'eval' freeform operations +% +% To enable undoing and applying the exactly same normalization to +% other data sets, normalization information is saved into a +% normalization struct, which has the fields: +% +% .type ; struct type, ='som_norm' +% .method ; normalization method, a string +% .params ; normalization parameters +% .status ; string: 'uninit', 'undone' or 'done' +% +% Normalizations are always one-variable operations. In the data and map +% structs the normalization information for each component is saved in the +% '.comp_norm' field, which is a cell array of length dim. Each cell +% contains normalizations for one vector component in a struct array of +% normalization structs. Each component may have different amounts of +% different kinds of normalizations. Typically, all normalizations are +% either 'undone' or 'done', but in special situations this may not be the +% case. The easiest way to check out the status of the normalizations is to +% use function SOM_INFO, e.g. som_info(sS,3) +% +% REQUIRED INPUT ARGUMENTS +% +% sS The data to which the normalization is applied. +% (struct) Data or map struct. Before adding any new +% normalizations, it is ensured that the +% normalizations for the specified components in the +% '.comp_norm' field have status 'done'. +% (matrix) data matrix +% +% OPTIONAL INPUT ARGUMENTS +% +% method The normalization(s) to add/use. If missing, +% or an empty variable ('' or []) is given, the +% normalizations in the data struct are used. +% (string) Identifier for a normalization method to be added: +% 'var', 'range', 'log', 'logistic', 'histD' or 'histC'. The +% same method is applied to all specified components +% (given in comps). The normalizations are first +% initialized (for each component separately, of +% course) and then applied. +% (struct) Normalization struct, or an array of structs, which +% is applied to all specified components. If the +% '.status' field of the struct(s) is 'uninit', +% the normalization(s) is initialized first. +% Alternatively, the struct may be map or data struct +% in which case its '.comp_norm' field is used +% (see the cell array option below). +% (cell array) In practice, the '.comp_norm' field of +% a data/map struct. The length of the array +% must be equal to the dimension of the given +% data set (sS). Each cell contains the +% normalization(s) for one component. Only the +% normalizations listed in comps argument are +% applied though. +% (cellstr array) norm and denorm operations in a cellstr array +% which are evaluated with EVAL command with variable +% name 'x' reserved for the variable. +% +% comps (vector) The components to which the normalization(s) is +% applied. Default is to apply to all components. +% +% OUTPUT ARGUMENTS +% +% sS Modified and/or updated data. +% (struct) If a struct was given as input argument, the +% same struct is returned with normalized data and +% updated '.comp_norm' fields. +% (matrix) If a matrix was given as input argument, the +% normalized data matrix is returned. +% +% EXAMPLES +% +% To add (initialize and apply) a normalization to a data struct: +% +% sS = som_normalize(sS,'var'); +% +% This uses 'var'-method to all components. To add a method only to +% a few selected components, use the comps argument: +% +% sS = som_normalize(sS,'log',[1 3:5]); +% +% To ensure that all normalization operations have indeed been done: +% +% sS = som_normalize(sS); +% +% The same for only a few components: +% +% sS = som_normalize(sS,'',[1 3:5]); +% +% To apply the normalizations of a data struct sS to a new data set D: +% +% D = som_normalize(D,sS); +% or +% D = som_normalize(D,sS.comp_norm); +% +% To normalize a data set: +% +% D = som_normalize(D,'histD'); +% +% Note that in this case the normalization information is lost. +% +% To check out the status of normalization in a struct use SOM_INFO: +% +% som_info(sS,3) +% +% +% SEE ALSO +% +% som_denormalize Undo normalizations of a data struct/set. +% som_norm_variable Normalization operations for a set of scalar values. +% som_info User-friendly information of SOM Toolbox structs. + +% Copyright (c) 1998-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 2.0beta juuso 151199 150500 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% check arguments + +error(nargchk(1, 3, nargin)); % check no. of input arguments is correct + +% sD +struct_mode = isstruct(sD); +if struct_mode, + switch sD.type + case 'som_map', D = sD.codebook; + case 'som_data', D = sD.data; + otherwise, error('Illegal struct.') + end +else + D = sD; +end +[dlen dim] = size(D); + +% comps +if nargin<3 | (ischar(comps) & strcmp(comps,'all')), + comps = [1:dim]; +end +if isempty(comps), return; end +if size(comps,1)>1, comps = comps'; end % make it a row vector + +% method +csNorm = cell(dim,1); +if nargin<2 | isempty(method), + if ~struct_mode, + warning('No normalization method given. Data left unchanged.'); + return; + end + method = ''; +else + % check out the given method + % (and if necessary, copy it for each specified component) + if ischar(method), + switch method, + case {'var','range','log','histD','histC','logistic'}, + sN = som_set('som_norm','method',method); + otherwise, + error(['Unrecognized method: ' method]); + end + for i=comps, csNorm{i} = sN; end + elseif isstruct(method), + switch method(1).type, + case {'som_map','som_data'}, csNorm = method(1).comp_norm; + case {'som_norm'}, for i=comps, csNorm{i} = method; end + otherwise, + error('Invalid struct given as normalization method.') + end + elseif iscellstr(method), + [dummy,sN] = som_norm_variable(1,method,'init'); + for i=comps, csNorm{i} = sN; end + elseif iscell(method), + csNorm = method; + else + error('Illegal method argument.') + end + % check the size of csNorm is the same as data dimension + if length(csNorm) ~= dim, + error('Given number of normalizations does not match data dimension.') + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% initialize + +% make sure all the current normalizations for current +% components have been done +if struct_mode, + alldone = 1; + for i = comps, + for j=1:length(sD.comp_norm{i}), + sN = sD.comp_norm{i}(j); + if ~strcmp(sN.status,'done'), + alldone = 0; + [x,sN] = som_norm_variable(D(:,i), sN, 'do'); + D(:,i) = x; + sD.comp_norm{i}(j) = sN; + end + end + end + if isempty(method), + if alldone, + warning('No ''undone'' normalizations found. Data left unchanged.'); + else + fprintf(1,'Normalizations have been redone.\n'); + end + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% action + +% add the new normalizations to the old ones +for i = comps, + if ~isempty(csNorm{i}), + [x,sN] = som_norm_variable(D(:,i), csNorm{i}, 'do'); + D(:,i) = x; + if struct_mode, + if isempty(sD.comp_norm{i}), sD.comp_norm{i} = sN; + else sD.comp_norm{i} = [sD.comp_norm{i}, sN]; end + end + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% output + +if struct_mode, + switch sD.type + case 'som_map', sD.codebook = D; + case 'som_data', sD.data = D; + otherwise, error('Illegal struct.') + end +else + sD = D; +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +