📄 som_sompaktrain.m
字号:
M = reshape(sMap,[prod(msize) dim]); else msize = [orig_size(1) 1]; dim = orig_size(2); end sMap = som_map_struct(dim,'msize',msize); sTopol = sMap.topol;end[munits dim] = size(sMap.codebook);% datagivendatafile = '';if ischar(D), data_name = D; givendatafile = D; D = []; dlen = NaN;else if isstruct(D), data_name = D.name; D = D.data; else data_name = inputname(2); end D = D(find(sum(isnan(D),2) < dim),:); % remove empty vectors from the data [dlen ddim] = size(D); % check input dimension if ddim ~= dim, error('Map and data dimensions must agree.'); endend% vararginsTrain = som_set('som_train','algorithm','seq',... 'neigh',sMap.neigh,... 'mask',ones(dim,1),... 'data_name',data_name);tlen_type = 'epochs';random_seed = 0; snapshotname = ''; snapshotinterval = 0;i=1; while i<=length(varargin), argok = 1; if ischar(varargin{i}), switch varargin{i}, % argument IDs case 'msize', i=i+1; sTopol.msize = varargin{i}; case 'lattice', i=i+1; sTopol.lattice = varargin{i}; case 'neigh', i=i+1; sTrain.neigh = varargin{i}; case 'trainlen', i=i+1; sTrain.trainlen = varargin{i}; case 'tlen_type', i=i+1; tlen_type = varargin{i}; case 'radius_ini', i=i+1; sTrain.radius_ini = varargin{i}; case 'radius', i=i+1; sTrain.radius_ini = varargin{i}(1); case 'alpha_type', i=i+1; sTrain.alpha_type = varargin{i}; case 'alpha_ini', i=i+1; sTrain.alpha_ini = varargin{i}; case 'alpha', i=i+1; sTrain.alpha_ini = varargin{i}(1); case 'seed', i=i+1; random_seed = varargin{i}; case 'snapshotname',i=i+1; snapshotname = varargin{i}; case 'snapshotinterval',i=i+1; snapshotinterval = varargin{i}; case {'sTrain','train','som_train'}, i=i+1; sTrain = varargin{i}; case {'topol','sTopol','som_topol'}, i=i+1; sTopol = varargin{i}; if prod(sTopol.msize) ~= munits, error('Given map grid size does not match the codebook size.'); end % unambiguous values case {'inv','linear'}, sTrain.alpha_type = varargin{i}; case {'hexa','rect'}, sTopol.lattice = varargin{i}; case {'gaussian','bubble'}, sTrain.neigh = varargin{i}; case {'epochs','samples'}, tlen_type = 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}; if prod(sTopol.msize) ~= munits, error('Given map grid size does not match the codebook size.'); end case 'som_train', sTrain = varargin{i}; otherwise argok=0; end else argok = 0; end if ~argok, disp(['(som_sompaktrain) Ignoring invalid argument #' num2str(i+2)]); end i = i+1; end% check topologyif struct_mode, if ~strcmp(sTopol.lattice,sMap.topol.lattice) | ... ~strcmp(sTopol.shape,sMap.topol.shape) | ... any(sTopol.msize ~= sMap.topol.msize), warning('Changing the original map topology.'); endendsMap.topol = sTopol; % complement the training structif ~isnan(dlen), sTrain = som_train_struct(sTrain,sMap,'dlen',dlen);else sTrain = som_train_struct(sTrain,sMap); endif isempty(sTrain.mask), sTrain.mask = ones(dim,1); end% training lengthif strcmp(tlen_type,'epochs'), if isnan(dlen), error('Training length given as epochs, but data length is not known.\n'); else rlen = sTrain.trainlen*dlen; endelse rlen = sTrain.trainlen; sTrain.trainlen = sTrain.trainlen/dlen; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check arguments% maskif any(sTrain.mask~=1), sTrain.mask = ones(dim,1); fprintf(1,'Ignoring given mask.\n');end% learning rateif strcmp(sTrain.alpha_type,'power'), sTrain.alpha_type = 'inv'; fprintf(1,'Using ''inv'' learning rate type instead of ''power''\n');end % neighborhoodif any(strcmp(sTrain.neigh,{'cutgauss','ep'})), fprintf(1,'Using ''gaussian'' neighborhood function instead of %s.\n',sTrain.neigh); sTrain.neigh = 'gaussian'; end% map shapeif ~strcmp(sMap.topol.shape,'sheet'), fprintf(1,'Using ''sheet'' map shape of %s.\n',sMap.topol.shape); sMap.topol.shape = 'sheet'; end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Action% write filesif ~isempty(givendatafile), temp_din = givendatafile; else temp_din = tempname; som_write_data(D, temp_din, 'x')endtemp_cin = tempname;som_write_cod(sMap, temp_cin)temp_cout = tempname;% check if the environment variable 'SOM_PAKDIR' has been definedif any(strcmp('SOM_PAKDIR', evalin('base', 'who'))) som_pak_dir = evalin('base', 'SOM_PAKDIR');else som_pak_dir = '';endif ~isempty(som_pak_dir) & ~strncmp(som_pak_dir(end), '/', 1) som_pak_dir(end + 1) = '/';endaini = sTrain.alpha_ini; atype = sTrain.alpha_type;if strcmp(atype,'inv'), atype = 'inverse_t'; endrad = sTrain.radius_ini;str = [som_pak_dir 'vsom ' ... sprintf('-cin %s -din %s -cout %s', temp_cin, temp_din, temp_cout) ... sprintf(' -rlen %d -alpha %g -alpha_type %s', rlen, aini, atype) ... sprintf(' -radius %g -rand %g ',rad,random_seed)];if ~isempty(snapshotname) & snapinterval>0, str = [str, sprintf(' -snapfile %s -snapinterval %d',snapshotname,snapshotinterval)];endfprintf(1,'Execute: %s\n',str);if isunix, [status,w] = unix(str); if status, fprintf(1,'Execution failed.\n'); end if ~isempty(w), fprintf(1,'%s\n',w); endelse [status,w] = dos(str); if status, fprintf(1,'Execution failed.\n'); end if ~isempty(w), fprintf(1,'%s\n',w); endendsMap_temp = som_read_cod(temp_cout);M = sMap_temp.codebook;if isunix unix(['/bin/rm -f ' temp_din ' ' temp_cin ' ' temp_cout]);else dos(['del ' temp_din ' ' temp_cin ' ' temp_cout]);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Build / clean up the return arguments% update structuressTrain = som_set(sTrain,'time',datestr(now,0));if struct_mode, sMap = som_set(sMap,'codebook',M,'mask',sTrain.mask,'neigh',sTrain.neigh); tl = length(sMap.trainhist); sMap.trainhist(tl+1) = sTrain;else sMap = reshape(M,orig_size);endreturn;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -