⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nn.m

📁 基于多元线性回归、偏最小二乘、神经网络、卡尔漫滤波、径向基网络、主成分分析等等的程序。可用于建模和预测。
💻 M
字号:

function [M1,M2,M3,M4,M5,M6,M7,M8] = nn(X,Y,d,gamma,momentum,epochs)

%   [M1,M2,...] = nn(X,Y,NN,gamma,momentum,epochs)
%
% Back-propagation of errors for feedforward perceptron network
% using momentum algorithm.
% PLEASE, rather use the MATLAB NNET Toolbox!
%
% Input parameters:
%  - X: Input data block (k x n)
%  - Y: Output data block (k x m)
%  - NN: Numbers of hidden layer elements in list form
%       (Positive meaning 'tansig', negative linear)
%  - gamma: Learning parameter (default 0.01)
%  - momentum: Momentum term (default 0)
%  - epochs: Number of cycles (default indefinitely) 
% Return parameters:
%  - Mi: Weight matrices for each layer (i <= 8)
%
% Heikki Hyotyniemi Dec.12, 2000


if nargin < 4
   gamma = 0.01;
end
if nargin < 5
   momentum = 0;
end
if nargin < 6
   epochs = inf;
end
[mx,nx] = size(X);
[my,ny] = size(Y);
if mx ~= my
   disp('Incompatible X and Y');
else
   m = mx;
end

D = length(d) + 1;
du = [nx,abs(d)]; du = du + 1;
dy = [abs(d),ny];
nonlinear = [sign(d),-1];
lambda = 2;
a = 2;

args = 'd';
rets = '';
for j = 1:D
   args = [args,',M',num2str(j)];
   rets = ['Y',num2str(j),',',rets];
end
for i = 1:D
   eval(['n',num2str(i),' = [dy(',num2str(i),'),du(',num2str(i),')]']);
   eval(['M',num2str(i),' = 2*(rand(n',num2str(i),')-0.5)/sqrt(du(',num2str(i),'));']);
   eval(['delta',num2str(i),' = zeros(n',num2str(i),');']);
end
for i = 1:D
   eval(['[',rets(1:length(rets)-1),'] = NNR(X,',args,');']);
   eval(['maxz = max(Y',num2str(i),');']);
   eval(['minz = min(Y',num2str(i),');']);
   eval(['avgz = mean(Y',num2str(i),');']);
   eval(['M',num2str(i),'(:,du(',num2str(i),')) = -(avgz''-M',num2str(i),'(:,du(',num2str(i),')));']);
   eval(['M',num2str(i),'(:,1:du(',num2str(i),')-1) = M',num2str(i),'(:,1:du(',num2str(i),')-1).*((1./((maxz-minz)/2))''*ones(1,du(',num2str(i),')-1));']);
end

for loop = 1:epochs
   order = randperm(m);
   cumE = 0;
   for i = 1:m
      Y0 = X(order(i),:);
      eval(['[',rets(1:length(rets)-1),'] = NNR(Y0,',args,');']);
      eval(['e=Y(order(i),:)''-Y',num2str(D),''';']);
      for j = D:-1:1
         
         eval(['M = M',num2str(j),';']);
         eval(['u = [Y',num2str(j-1),''';1];']);
         z = M*u;
         if nonlinear(j) > 0
            grad = ((-2*2*a*exp(-a*z)./(1+exp(-a*z)).^2).*e)*u';
         else
            grad = -2*a*e*u';
         end   
         e = M'*e;
         e = e(1:length(e)-1);
         gam = gamma*lambda^(D-j);
         eval(['delta',num2str(j),' = momentum*delta',num2str(j),' - gam*grad;']);
         eval(['M',num2str(j),' = M',num2str(j),' + delta',num2str(j),';']);         
      end      
   end
   eval(['[Yhat] = NNR(X,',args,');']);
   E = Y - Yhat;
   EE = E.*E;
   ee = sum(sum(EE));
   clf;
   hold on;
   [V,L] = eig(Y'*Y);
   [maxL,maxi] = max(diag(L));
   plot(Y*V(:,maxi),'r*');
   plot(Yhat*V(:,maxi),'bo');
   title('Approximation (projected onto the 1st pc)');
   drawnow;
   if isinf(epochs)
      reply = input([num2str(loop),'. SSE=',num2str(ee),' - Give gamma or ''N'' to break: '],'s');
      if ~isempty(reply) & (reply == 'N' | reply == 'n')
         break;
      end
      if ~isempty(reply)
         lambda = str2num(reply);
      end
   end
      
end
   
            
            
            
            
            
            
      

⌨️ 快捷键说明

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