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

📄 sgnt_generating.m

📁 用matlab编写的基于自生成神经网络(self-generated neural network)的预测方法(包含数据集)
💻 M
字号:
function [node] = sgnt_generating(y1,m)
% Generating A Self-Generating Neural Tree for traning a SGNN
% Copyright By Li Aiguo in 26/4/2003
%Input: y1: training set
%       m:  input vector dimision
%Ouput: node: a SGNT
%   node(j): (wj1,...,wjm);cj; Father_ptr; FirstChild_ptr; NextSibling_ptr  

%*****************************************************************************
% [nr,nc]= size(y1);
% if nr< nc  y1=y1'; end

%**************************************************************
% Generating a SGNT named node
%**************************************************************
% generating a root of the tree
 for k=1:1:m  node(1,k)= y1(1,k);   end
 node(1,m+1)= 1;
 node(1,m+2)= 0;
 node(1,m+3)= 0;
 node(1,m+4)= 0;
    
%****************************************************
% Generating the tree
[nr,nc]= size(y1);
 j= 2;
 for i=2:1:nr   
   % choose(i,node)
    [noder,nodec]= size(node);
    for h=1:1:noder
       for k=1:1:m  w(k)= node(h,k);       end 
       d1(h,2)=h;         
      % d1(h,1)=sqrt((y1(i,:)-w)*(y1(i,:)-w)');
      d1(h,1)=sum((y1(i,:)-w).^2);
    end
    d1= paixu(d1,1);
    winner= d1(1,2);
     
    %*************************************************       
    if node(winner,m+3)== 0  % winner is a leaf 
          % copy(n_j,n_win); and  % connect(n_j,n_win);
          node(j,:)= node(winner,:);
          node(j,m+1)= 1;
          node(j,m+2)= winner;
          node(j,m+3)= 0;
          node(j,m+4)= 0;
          node(winner,m+3)= j;
          j= j+1;
     end
       
    % copy(n_j,e_i);
     for k=1:1:m  node(j,k)= y1(i,k);   end
     node(j,m+1)= 1;
     node(j,m+2)= winner;
     node(j,m+3)= 0;
     node(j,m+4)= 0;
     
     % connect(n_j,n_win);
     node(winner,m+1)= node(winner,m+1)+1;
     
     xx= node(winner,m+3);
     while(xx >0)
        if node(xx,m+4)==0  node(xx,m+4)=j; break;  end 
        xx= node(xx,m+4);
     end
     j=j+1;
     
     % update(e_i,n_win)
      for k=1:1:m   
         node(winner,k)= node(winner,k)+(y1(i,k)-node(winner,k))/node(winner,m+1);
      end
      
      while(winner > 1)
         winner= node(winner,m+2);
         node(winner,m+1)= node(winner,m+1)+1;
         for k=1:1:m   
            node(winner,k)= node(winner,k)+(y1(i,k)-node(winner,k))/node(winner,m+1);
         end
      end 
  end
 
 %*******************************************************
 % Purning a SGNT named node
 %*******************************************************

 % VWP Purning  VWP(Vertically Well Placed) d(n,np)<=d(n,ng)
 
 [nr,nc]= size(node);
 for i=2:1:nr
    parent_pt= node(i,m+2);
    if parent_pt > 0
       grandparent_pt= node(parent_pt,m+2);
       if grandparent_pt > 0
          for k=1:1:m
             wn(k)= node(i,k);
             wp(k)= node(parent_pt,k);
             wg(k)= node(grandparent_pt,k); 
          end
          %dnp=sqrt((wn-wp)*(wn-wp)'/m);
          %dng=sqrt((wn-wg)*(wn-wg)'/m);
          dnp=sum((wn-wp).^2);
          dng=sum((wn-wg).^2);
          
          if dnp > dng
             % update np             
             for k=1:1:m
                node(parent_pt,k)= (node(parent_pt,k)*node(parent_pt,m+1)-...
                   node(i,k)*node(i,m+1))/(node(parent_pt,m+1)- node(i,m+1));
             end
             node(parent_pt,m+1)= node(parent_pt,m+1)- node(i,m+1);
             % connect(n,ng)
             node(i,m+2)= grandparent_pt;   %  1
             pointer=node(grandparent_pt,m+3);
             while (pointer > 0)
                s_pointer=node(pointer,m+4);
                if s_pointer ==0   node(pointer,m+4)= i; break; end   % 2
                pointer= s_pointer;
             end
             pointer= node(parent_pt,m+3);
             if pointer==i 
                node(parent_pt,m+3)= node(i,m+4);                
             else 
                while (pointer > 0)
                   s_pointer= node(pointer,m+4);
                   if s_pointer== i   node(pointer,m+4)= node(i,m+4); break;  end  % 3
                   pointer= s_pointer;
                end
             end
             node(i,m+4)= 0;
             
          end 
          
       end
    end
 end
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % merge    
  for i=1:1:nr 
     if node(i,m+3)>0
        if node(node(i,m+3),m+4)==0
           temp=0;
           for k=1:1:m
              if node(i,k)==node(node(i,m+3),k)  temp=temp+1;  end
           end
           if temp == m
              node(node(i,m+3),m+2)=0;
              temp_ptr = node(node(i,m+3),m+3);
              child= node(node(i,m+3),m+3);
              node(node(i,m+3),m+3)= 0;
              node(i,m+3)=temp_ptr;
              while (child>0)
                 node(child,m+2)= i;
                 child= node(child,m+4);
              end
           end
        end 
     end
  end 
  
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % HWP Purning  HWP(Horizontally Well Placed) d(n,np)<=d(n,ns)
 
 [nr,nc]= size(node); 
 for i=2:1:nr
    if node(i,m+2)>0 & node(i,m+4)>0
       j=1;
       x(j)= node(i,m+4);
       temp= x(j);
       while ( temp> 0)
          temp= node(x(j),m+4);
          if temp > 0
             j=j+1;
             x(j)= temp;
          end 
       end
        
       for k=1:1:m 
          w(k)= node(i,k);
          wp(k)= node(node(i,m+2),k);
       end
       
       %dp=sqrt((w-wp)*(w-wp)'/m);
       dp=sum((w-wp).^2);
       for j=1:1:length(x)
          for k=1:1:m    ws(k)= node(x(j),k);      end
         % ds=sqrt((w-ws)*(w-ws)'/m);
         ds=sum((w-ws).^2);
          if dp > ds
             % update ns            
             if node(x(j),m+3)==0  %x(j) is a leaf
                dead = 0;
                for jj=2:1:nr
                   if node(jj,m+2)==0  
                      dead= jj; 
                      break;  
                   end
                end
                
                if dead== 0
                   node(nr+1,:)= node(x(j),:);
                   node(nr+1,m+2)= x(j);
                   node(nr+1,m+3)= 0;
                   node(nr+1,m+4)= 0;
                   node(x(j),m+3)= nr+1;
                   nr= nr+1;
                else
                   node(dead,:)= node(x(j),:);
                   node(dead,m+2)= x(j);
                   node(dead,m+3)= 0;
                   node(dead,m+4)= 0;
                   node(x(j),m+3)= dead;
                end
             end
             
             for k=1:1:m
                node(x(j),k)= (node(x(j),k)*node(x(j),m+1)+node(i,k)*node(i,m+1))...
                   /(node(x(j),m+1)+ node(i,m+1));
             end
             node(x(j),m+1)= node(x(j),m+1)+ node(i,m+1);
             % connect(n,ns)
             if node(node(i,m+2),m+3)== i   
                node(node(i,m+2),m+3)= node(i,m+4);
                node(i,m+4)= 0;                
             elseif node(i,m+4) == 0 
                node(x(length(x)),m+4)= 0;
                node(i,m+4)= 0;                
             elseif ~(node(node(i,m+2),m+3)== i) &  node(i,m+4) > 0 
                sibling= node(node(x(j),m+2),m+3);
                while ( node(sibling,m+4)>0 )
                   if node(sibling,m+4)== i  node(sibling,m+4)= node(i,m+4); end
                   sibling= node(sibling,m+4);
                end
                node(i,m+4)= 0;
             end
             node(i,m+2)= x(j); 
                         
             pointer= node(x(j),m+3);
             sibling= pointer;
             while ( node(pointer,m+4) > 0 )
                  sibling= pointer;
                  pointer= node(pointer,m+4);
             end
             node(sibling,m+4)= i;
             
          end 
       end
       
    end
    clear x
 end
 
%********************************************888

⌨️ 快捷键说明

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