wrescale.m

来自「基于MATLAB的神经网络非线性系统辨识软件包.」· M 代码 · 共 143 行

M
143
字号
function [W1,W2]=wrescale(nntype,W1,W2,Uscale,Yscale,NN)
% WRESCALE
% --------
%         Rescale weights of a trained network so that the network
%         can work on unscaled data.
%
% Calling [W1,W2]=wrescale(method,W1,W2,Uscale,Yscale,NN) rescales the weights
% for networks with LINEAR OUTPUT UNITS. The function works for
% ordinary feed-forward networks as well as for input-output models of dynamic
% systems (i.e. NNAR(X), NNARMA(X) and NNOE type models). Notice that when
% the function is used on a pruned network it will re-introduce the biases removed
% during the pruning session.
%
% NN is left out for neural networks that are not models of dynamic systems.
%
% INPUTS:
%      method - The function applied for generating the model. For example
%               method='nnarx' or method='nnoe'. Use method='inverse' for 
%               inverse models.
%      W1     - Input-to-hidden of network trained on scaled data
%      W2     - Hidden-to-output weights
%      Uscale - Matrix containing sample mean and standard deviation for
%               each input. For time series an empty matrix, [], is passed. 
%      Yscale - Matrix containing mean and std's for each output.
%      NN     - Vector containing lag spaces (see nnarx, nnarmax, nnoe ..)
%
% OUTPUTS:
%      W1, W2 - "Unscaled" weight matrices.
%
% See the function DSCALE on how to scale the data before training.

% Written by Magnus Norgaard, IAU/IMM, Technical University of Denmark
% LastEditDate: Jan. 15, 2000

if strcmpi(nntype,'nniol')
   if ~iscell(W1) | ~iscell(W2)
      error('arguments W1 and W2 must cell structures when method is "nniol"');
   else
      W1f = W1{1}; W2f = W2{1};
      W1g = W1{2}; W2g = W2{2};
      [hiddenf,netinputs] = size(W1f);
      [hiddeng,netinputs] = size(W1g);
   end
else
   [hidden,netinputs] = size(W1);
end
[inputs,dummy]  = size(Uscale);
[outputs,dummy] = size(Yscale);

% ----- Rescale input-to-hidden weights -----
% -- Ordinary networks --
if strcmpi(nntype,'marq') | strcmpi(nntype,'marqlm') | strcmpi(nntype,'rpe') | ...
      strcmpi(nntype,'batbp') | strcmpi(nntype,'incbp') | strcmpi(nntype,'igls') 
   meanvec = Uscale(:,1);
   stdvec  = Uscale(:,2);
   
% -- Inverse models --
elseif strcmpi(nntype,'inverse') | strcmpi(nntype,'general')
  meanvec = repmat(Yscale(1),NN(1)+1,1);
  stdvec  = repmat(Yscale(2),NN(1)+1,1);
  meanvec = [meanvec;repmat(Uscale(1),NN(2)-1,1)];
  stdvec  = [stdvec;repmat(Uscale(2),NN(2)-1,1)];
  outputs = 1;
  
% -- Dynamic models --
else
  lagtot =  sum(sum(NN(1:size(NN,2)-size(Uscale,1))))+1;
  if (~strcmpi(nntype,'nnarmax1') & ~strcmpi(nntype,'nniol') & lagtot ~= netinputs) | ...
         (strcmpi(nntype,'nniol')  & lagtot ~= netinputs+1) ,
    error('You have made an error in the call of "wrescale"')
  end
  meanvec = Yscale(1)*ones(NN(1),1);
  stdvec  = Yscale(2)*ones(NN(1),1);
  nc = 0;
  
  % NARMAX2 model
  if strcmpi(nntype,'nnarmax2') | strcmpi(nntype,'nnramx2')
     nab=sum([NN(1:inputs) NN(inputs+1:inputs+outputs)]);
     nc = NN(inputs+outputs+1);
     
  % NARMAX model, linear noise filter
  elseif strcmpi(nntype,'nnarmax1') | strcmpi(nntype,'nnrarmx1')
     nab=sum([NN(1:inputs) NN(inputs+1:inputs+outputs)]);
     nc = NN(inputs+outputs+1);
     if nab==netinputs-1,
       nc = 0;
     end
  end
  
  % For all dynamic models
  for k=1:inputs,
    meanvec = [meanvec;Uscale(k,1)*ones(NN(k+1),1)];
    stdvec  = [stdvec;Uscale(k,2)*ones(NN(k+1),1)];
  end
  if nc>0,         % NARMAX models
    meanvec = [meanvec;zeros(nc,1)];
    stdvec  = [stdvec;Yscale(2)*ones(nc,1)];
  end
end

% ----- Rescale input-to-hidden weights -----
if strcmpi(nntype,'nniol')
   meanvec = meanvec(1:end-1);
   stdvec  = stdvec(1:end-1);
   for k=1:netinputs-1,
     W1f(:,k) = W1f(:,k)/stdvec(k);
     W1f(:,netinputs) = W1f(:,netinputs) - W1f(:,k)*meanvec(k);
     W1g(:,k) = W1g(:,k)/stdvec(k);
     W1g(:,netinputs) = W1g(:,netinputs) - W1g(:,k)*meanvec(k);
  end
else
  for k=1:netinputs-1,
     W1(:,k) = W1(:,k)/stdvec(k);
     W1(:,netinputs) = W1(:,netinputs) - W1(:,k)*meanvec(k);
  end
end

% ----- Rescale hidden-to-output weights -----
if strcmpi(nntype,'inverse') | strcmpi(nntype,'general')
   meanvec = Uscale(:,1);
   stdvec  = Uscale(:,2);
else
   meanvec = Yscale(:,1);
   stdvec  = Yscale(:,2);
end   
if strcmpi(nntype,'nniol')
      k=1;
      W2f(k,:) = W2f(k,:)*stdvec(k);
      W2f(k,hiddenf+1) = W2f(k,hiddenf+1)+meanvec(k);
      W2g(k,:) = W2g(k,:)*stdvec(k)/Uscale(2);
      
      W1f = [W1f;W1g];
      W2f = [W2f(1:hiddenf) -W2g(1:hiddeng)*Uscale(1) W2f(hiddenf+1)-W2g(hiddeng+1)*Uscale(1)];
    %  NetDeff = [repmat('H',1,hiddenf+hiddeng);'L' repmat('-',1,hiddenf+hiddeng-1)];
      W1 = {W1f,W1g};
      W2 = {W2f,W2g};
else
  for k=1:outputs,
    W2(k,:) = W2(k,:)*stdvec(k);
    W2(k,hidden+1) = W2(k,hidden+1)+meanvec(k);
  end
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?