📄 sgnt_generating.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 + -