📄 som_normalize.m
字号:
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 argumentserror(nargchk(1, 3, nargin)); % check no. of input arguments is correct% sDstruct_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.') endelse D = sD;end[dlen dim] = size(D);% compsif nargin<3 | (ischar(comps) & strcmp(comps,'all')), comps = [1:dim]; endif isempty(comps), return; endif size(comps,1)>1, comps = comps'; end % make it a row vector% methodcsNorm = 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.') endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% initialize% make sure all the current normalizations for current % components have been doneif 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 endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% action % add the new normalizations to the old onesfor 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 endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% outputif struct_mode, switch sD.type case 'som_map', sD.codebook = D; case 'som_data', sD.data = D; otherwise, error('Illegal struct.') endelse sD = D;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -