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

    function [D, Wh, Wo] = Backpropagation_Recurrent(train_features, train_targets, params, region)

% Classify using a backpropagation recurrent network with a batch learning algorithm
% Inputs:
% 	features- Train features
%	targets	- Train targets
%	params   - Number of hidden units, Convergence criterion, Convergence rate
%	region	- Decision region vector: [-x x -y y number_of_points]
%
% Outputs
%	D			- Decision sufrace
%   Wh          - Hidden unit weights
%   Wo          - Output unit weights

[Nh, Theta, eta] = process_params(params);
[Ni, M] 	= size(train_features);
eta		= eta/M;
iter		= 0;
NiterDisp= 1;
maxIter 	= 100;

No		  = 1; %Number of output units

%For the decision region
xx	= linspace(region(1),region(2),region(5));
yy	= linspace(region(3),region(4),region(5));
D  = zeros(region(5));

train_targets = (train_targets>0)*2-1;
means			  = mean(train_features')';
train_features= train_features - means*ones(1,M);
train_features= [train_features; ones(1,M)];
Ni				  = Ni + 1;

%Init the network weights
w0		= max(abs(std(train_features')'));
W		= rand(Nh+No, Ni+No+Nh).*w0*2-w0; %The first Nh units are hidden, and the last No are the output
W     = W/mean(std(W'))*(Nh+No)^(-0.5);

rate	= 10*Theta;
J       = 1e3;

while (rate > Theta),
    %Randomally choose an example
    i	= randperm(M);
    m	= i(1);
    Xm = train_features(:,m);
    tk = train_targets(m);

    dOut    = 1;   %Fraction of change in output at time t
    dOutOld = 2;
    y_k     = zeros(Nh+No, 1);
    P_k     = zeros(Nh+No, Nh+No, Ni+Nh+No);
    U       = zeros(Nh+No, Nh+No, Ni+Nh+No);
    C       = [zeros(1, Nh) ones(1, No)];
    deltaW  = zeros(size(W));
    iter1    = 0;
    
    %Now, introduce the input to the net, and continue to feed it until it stabilizes
    while ((abs(dOut-dOutOld)/dOutOld > 1e-3) & (iter1 < maxIter)),
        iter1 = iter1 + 1;
        
        %Compute network output
        z_k                 = [Xm; y_k];
        net_k               = W*z_k;
        [y_k_tplus1, dy_k]  = activation(net_k);
        
        %Compute the error
        e_k                 = (tk - C*y_k_tplus1)';
        
        dOutOld             = dOut;
        dOut                = sum(abs(e_k./tk));
        
        %Build U and Phi
        for i = 1:Nh+No,
            U(i,i,:) = z_k';
        end
        Phi = eye(No+Nh) .* (dy_k*ones(1,No+Nh));
        
        %Compute the weight update
        for i = 1:Nh+No,
            deltaW(i,:)     = deltaW(i,:) + eta * C * squeeze(P_k(i,:,:)) * e_k;
        end
                
        %Update P_k
        for i = 1:Nh+No,
            P_k(i,:,:)      = Phi * (W(:,Ni+1:end) * squeeze(P_k(i,:,:)) + squeeze(U(i,:,:)));
        end

        y_k                 = y_k_tplus1;

    end

    %Update the weights
    W                   = W + deltaW;

    %Measure the error
    OldJ = J;
    J    = 0;
    for i = 1:M,
        Xm = train_features(:,i);
        tk = train_targets(i);

        dOut    = 1;   %Fraction of change in output at time t
        dOutOld = 2;
        y_k     = zeros(Nh+No, 1);
        iter1    = 0;
        
       %Now, introduce the input to the net, and continue to feed it until it stabilizes
        while ((abs(dOut-dOutOld)/dOutOld > 1e-3) & (iter1 < maxIter)),
            iter1 = iter1 + 1;
            %Compute network output
            z_k     = [Xm; y_k];
            net_k   = W*z_k;
            y_k     = activation(net_k);
            e_k     = (tk - C*y_k)';
            dOutOld = dOut;
            dOut    = sum(abs((tk-e_k)./tk));
        end
        
        J   = J + (tk - e_k).^2;        
    end
    J = J/M; 
    rate  = abs(J - OldJ)/OldJ*100;
               
    iter 			= iter + 1;
    if (iter/NiterDisp == floor(iter/NiterDisp)),
        disp(['Iteration ' num2str(iter) ': Error is ' num2str(J)])
    end
    
end

disp(['Backpropagation converged after ' num2str(iter) ' iterations.'])

%Find the decision region
for i = 1:region(5),
    for j = 1:region(5),
        Xm = [xx(i) - means(1); yy(j) - means(2); 1];
        
        dOut    = 1;   %Fraction of change in output at time t
        dOutOld = 2;
        y_k     = zeros(Nh+No, 1);
        iter1    = 0;
        
        %Now, introduce the input to the net, and continue to feed it until it stabilizes
        while ((abs(dOut-dOutOld)/dOutOld > 1e-3) & (iter1 < maxIter)),
            iter1 = iter1 + 1;
            
            %Compute network output
            z_k     = [Xm; y_k];
            net_k   = W*z_k;
            y_k     = activation(net_k);
            e_k     = (tk - C*y_k);
            dOutOld = dOut;
            dOut    = sum(abs((tk-e_k)./tk));
        end
        D(i,j) = y_k(end);
    end
end
D = D'>0;

function [f, df] = activation(x)

a = 1.716;
b = 2/3;
f	= a*tanh(b*x);
df	= a*b*sech(b*x).^2;