www.gusucode.com > classification_matlab_toolbox分类方法工具箱源码程序 > code/Classification_toolbox/Kohonen_SOFM.m

    function [features, targets, label] = Kohonen_SOFM(train_features, train_targets, params, region, plot_on)

%Reduce the number of data points using a Kohonen self-orgenizing feature map algorithm
%Inputs:
%	train_features	- Input features
%	train_targets	- Input targets
%	params			- [Number of output data points, Window width]
%	region			- Decision region vector: [-x x -y y number_of_points]
%  plot_on         - Plot stages of the algorithm
%
%Outputs
%	features			- New features
%	targets			- New targets
%	label				- The labels given for each of the original features

[Nmu, win_width] = process_params(params);
if (nargin < 5),
    plot_on = 0;
end

[D,L]	= size(train_features);
dist	= zeros(Nmu,L);
label = zeros(1,L);

%Initialize W
W			= sqrtm(cov(train_features',1))*randn(D,Nmu);
W			= W ./ (ones(D,1)*sqrt(sum(W.^2)));
dW			= 1;

%Learning rate
eta		= 0.5;
deta		= 0.995;
iter		= 0;

while (dW > 1e-15),
   %Choose a sample randomally
   i		= randperm(L);
   phi	= train_features(:,i(1));
   
   net_k = W'*phi;
   y_star= find(net_k == max(net_k));
   y_star= y_star(1); %Just in case two have the same weights!
   
   oldW	= W;
   W		= W + eta*phi*gamma(win_width*abs(net_k - y_star))';
   W		= W ./ (ones(D,1)*sqrt(sum(W.^2)));
   
   eta	= eta * deta;
   
   dW		= sum(sum(abs(oldW-W)));
   iter	= iter + 1;   
   
   if (plot_on == 1),
      %Assign each of the features to a center
      dist        = W'*train_features;
      [m, label]  = max(dist);
      centers     = zeros(D,Nmu);
      for i = 1:Nmu,
         in = find(label == i);
         if ~isempty(in)
            centers(:,i) = mean(train_features(:,find(label==i))')';
         else
            centers(:,i) = nan;
         end
      end
      plot_process(centers)
   end
   
   if (iter/100 == floor(iter/100)),
      disp(['Iteration number ' num2str(iter)])
   end
   
end

%Assign a weight to each feature
label = zeros(1,L);
for i = 1:L,
   net_k 	= W'*train_features(:,i);
   label(i) = find(net_k == max(net_k));
end

%Find the target for each weight and the new features
targets 	= zeros(1,Nmu);
features	= zeros(D, Nmu);
for i = 1:Nmu,
   in				= find(label == i);
   if ~isempty(in),
      targets(i)		= sum(train_targets(in)) / length(in) > .5;
      if length(in) == 1,
         features(:,i)	= train_features(:,in);
      else
         features(:,i)  = mean(train_features(:,in)')';
      end
   end
   
end


function G = gamma(dist)
%The activation function for the SOFM
G = exp(-dist);