MATLAB CODE FOR ADAPTIVE RESONANCE THEORY






function [V,W] = art1s(p,rho,flag,V,W)                              
BACK TO HOME PAGE
%ART1S    ART1 simulation function.
%                                                                                   
BACK TO PROJECT PAGE
%         [V,W] = ART1S(P,rho,flag)
%           P   - F1xQ matrix of input vectors.                      
BACK TO MATLAB CODE
%           rho - the vigilance parameter, 0<= rho <=1.         
%           flag  - (Optional) Printing flag. Any value of flag   
Continue looking at Code
%                   enables printing of events.
%         Returns:
%           V - the new top-down (T-D) weight matrix F1xF2.
%           W - the new bottom-up (B-U) weight matrix F2xF1.
%               F2 is the number of nodes in layer F2 (max # of categories)
%   Example:   P = letno;
%   art1s(P,0.7);
%  
%  See also LETNO

%   Author: Val Ninov, e-mail: valninov@total.net
%    Grad. Student, Dept. of Electrical Engineering
%           Concordia University, Montreal, Canada
%    (c) April, 1997
%   References:
%    [1] Carpenter, G. A. and S. Grossberg, "ART2: self-organization
%  of stable category recognition codes for analog input patterns."
%  Applied Optics, vol. 26, no. 23, Dec. 1987, pp. 4919-4930.
%    [2] J. Freeman and D. Skapura, Neural Networks: Algorithms,
%  Applications, and Programming Techniques. Addison Wesley


if nargin<2 | nargin>5  error('Wrong number of input arguments.');  end

% NETWORK PARAMETERS
[R,Q] = size(p);
F1 = R;
F2 = Q;
L = 2;
categ = zeros(F2,F2); % category table
count = ones(1,F2);   % counter for patterns in one category

% INITIALIZE WEIGHTS
if nargin < 4
W = ones(F2,F1)*(L/(L-1+F1));
V = ones(F1,F2);
fprintf('INITIAL TOP-DOWN MATRIX :');  V
fprintf('INITIAL BOTTOM-UP MATRIX :'); W
end

% INITIALIZE RETURN VARIABLES
a1 = zeros(F1,Q);   % output of F1
i = zeros(1,Q);     % winner index
win = 1;     % First time node 1 in F2 is the winner
nActive = 1;        % The number of active neurons in F2

% PRESENT EACH INPUT VECTOR
for q=1:Q
    Reset = 0;
    B2 = zeros(F2,1);
    resonance = 0;
  while ~resonance    % REPEAT UNTIL: LAYERS F1 & F2 RESONATE
          % Initially a1 = p;
          % Calculate the winning node in F2 (among the active nodes)
   A2 = compet(W(1:nActive,:)*p(:,q)+B2(1:nActive,1));
          i(q) = find(A2 == 1);
          win = i(q);
      % RECALCULATE a1 WITH FEEDBACK FROM A2
      a1(:,q) = (p(:,q) & V(:,win));

      % RESET if the new a1 is too different from p
S= sum(a1(:,q));
X= sum(p(:,q));
      Reset = (S/X) < rho;

       % IF RESET: TAKE WINNING NEURON IN F2 OUT OF COMPETITION
       if Reset
          B2(win) = -100;
             if nargin == 3
              fprintf('              RESET: Pattern %0.f resets F2 neuron %0.f.\n',q,win);
             end

           % IF ALL NEURONS IN A2 OUT OF COMPETITION ADD NEURON TO LAYER 2
           if all(B2(1:nActive,1) == -100)
      nActive = nActive + 1;
                if nargin == 3
                 fprintf('            A new category %d created\n',nActive);
                end
               win = nActive;
           end
        
      % ELSE RESET NEURON DOES NOT FIRE: LAYERS 1 & 2 RESONATE
      else
           if nargin == 3
             fprintf('Pattern %d classified in %d category.\n',q,win);
           end
      resonance = 1;
      end 

    end  % end of WHILE loop

     % Update B-U LTM and T-D LTM
     V(:,win) = a1(:,q)&V(:,win);
     W(win,:) = (a1(:,q)*L/(L-1+sum(a1(:,q))))';
V(:,win) = V(:,win).*p(:,q);
W(win,:) = (V(:,win).*p(:,q))'/(0.5 + sum(V(:,win).*p(:,q)));
  categ(win, count(win)) = q;
         count(win) = count(win)+1;
end % end of FOR loop

% Display final classification
fprintf('\n  Category      Pattern\n  -----------------------------------------------\n');
for i = 1:nActive
  fprintf('     %d           ',i);
   for j= 1:F2
if categ(i,j)
         fprintf('%s, ',(categ(i,j)+64));
     end
   end
  
 
  
   fprintf('\n  ------------------------------------------------\n');
  
end

end
1