Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/neural_gas.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/neural_gas.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,89 @@ +function [Neurons] = neural_gas(D,n,epochs,alpha0,lambda0) + +%NEURAL_GAS Quantizes the data space using the neural gas algorithm. +% +% Neurons = neural_gas(D, n, epochs, [alpha0], [lambda0]) +% +% C = neural_gas(D,50,10); +% sM = som_map_struct(sD); +% sM.codebook = neural_gas(sD,size(sM.codebook,1),10); +% +% Input and output arguments ([]'s are optional): +% D (matrix) the data matrix, size dlen x dim +% (struct) a data struct +% n (scalar) the number of neurons +% epochs (scalar) the number of training epochs (the number of +% training steps is dlen*epochs) +% [alpha0] (scalar) initial step size, 0.5 by default +% [lambda0] (scalar) initial decay constant, n/2 by default +% +% Neurons (matrix) the neuron matrix, size n x dim +% +% See also SOM_MAKE, KMEANS. + +% References: +% T.M.Martinetz, S.G.Berkovich, and K.J.Schulten. "Neural-gas" network +% for vector quantization and its application to time-series prediction. +% IEEE Transactions on Neural Networks, 4(4):558-569, 1993. + +% Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Vesanto +% Copyright (c) by Juha Vesanto +% http://www.cis.hut.fi/projects/somtoolbox/ + +% juuso 101297 020200 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Check arguments and initialize + +error(nargchk(3, 5, nargin)); % check the number of input arguments + +if isstruct(D), D = D.data; end +[dlen,dim] = size(D); +Neurons = (rand(n,dim)-0.5)*10e-5; % small initial values +train_len = epochs*dlen; + +if nargin<4 | isempty(alpha0) | isnan(alpha0), alpha0 = 0.5; end +if nargin<5 | isempty(lambda0) | isnan(lambda0), lambda0 = n/2; end + +% random sample order +rand('state',sum(100*clock)); +sample_inds = ceil(dlen*rand(train_len,1)); + +% lambda +lambda = lambda0 * (0.01/lambda0).^([0:(train_len-1)]/train_len); + +% alpha +alpha = alpha0 * (0.005/alpha0).^([0:(train_len-1)]/train_len); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% Action + +for i=1:train_len, + + % sample vector + x = D(sample_inds(i),:); % sample vector + known = ~isnan(x); % its known components + X = x(ones(n,1),known); % we'll need this + + % neighborhood ranking + Dx = Neurons(:,known) - X; % difference between vector and all map units + [qerrs, inds] = sort((Dx.^2)*known'); % 1-BMU, 2-BMU, etc. + ranking(inds) = [0:(n-1)]; + h = exp(-ranking/lambda(i)); + H = h(ones(length(known),1),:)'; + + % update + Neurons = Neurons + alpha(i)*H.*(x(ones(n,1),known) - Neurons(:,known)); + + % track + fprintf(1,'%d / %d \r',i,train_len); + if 0 & mod(i,50) == 0, + hold off, plot3(D(:,1),D(:,2),D(:,3),'bo') + hold on, plot3(Neurons(:,1),Neurons(:,2),Neurons(:,3),'r+') + drawnow + end +end + +fprintf(1,'\n'); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \ No newline at end of file