加入收藏
大学数学, 研究生数学,大学数学资料下载,免费 大学数学课件,研究生数学课件,免费下载
投影寻踪学习网络-Matlab程序
2013-12-13 09:18:03

大学做论文时做的投影寻踪学习网络算法,好久没看了,拿出来晒晒,大家可以参考和改进

function ppln()

clear;

fid=fopen('d:\lynx.txt','r');

[a,count]=fscanf(fid,'%f');

sa=size(a);

ma=mean(a);

va=var(a);

a=100*(a-ma)./va;

x=[a(1:sa-3),a(2:sa-2),a(3:sa-1)];

y=a(4:sa);

plot(y);

pplncore(x,y,3);


%pplncore 实现投影寻踪学习网络的核心功能

%x 输入数据 Y 输出数据 hidenum 隐含节点数

function pplncore(x,y,hideNum)

sx=size(x);%sx(1) x矩阵的行 sx(2) x矩阵的列

sy=size(y);%sy(1) y矩阵的行 训练的样本数

global alpha;  %

global beta;   %

global f;%投影后的结果

global L; %样本的数量

global C;  

double varY; %输出的方差

double meanY;%输出的均值

IterationNum=500;%迭代次数

R=7; %多项式阶数

L2error=100.0;%全局误差

L2E=zeros(1,IterationNum);

if sx(1)==sy(1) && sx(2)>1%判断数据是否相符合

   %初始化----------------

   L=sx(1);

   m_in=sx(2);    

   alpha=rand(m_in,hideNum);

   beta=rand(hideNum,1);

   varY=var(y);

   meanY=mean(y);

   f=rand(L,hideNum);

   deta=zeros(m_in,1);

%     disp(meanY);

  %PPLN主体

   fc=zeros(1,R+1);                  

   for j=1:R+1

       fc(j)=factorial(j-1);%计算阶乘

   end

   itnum=IterationNum;

   while(itnum>0 && abs(L2error)>0.000001)%判断迭代过程是否达到上限或精度达到要求

       for h=1:hideNum %依次更新隐函数的估计

           Xoldl2=110.0;

           while(abs((Xoldl2-L2error)/Xoldl2)>0.005)  %对i个隐细胞使训练达到L2最小

             Xoldl2=L2error;

%   %计算f^&f^'------              

        %     for k=1:3

                 tp=f*beta-f(:,h).*beta(h);                  

                 Yk=(beta(h).*(y-meanY-tp))./(beta(h)*beta(h));% Yk即是f*组成的向量

                 z=x*alpha(:,h);%L行1列数据

%                   disp(z);

                 hr=ones(L,R+1);    

                 hr(:,2)=2*z;

%                  disp(hr);

                 for j=3:R+1                    

                       hr(:,j)=2*z.*hr(:,j-1) -2*(j-2)* hr(:,j-2);                  

%                        disp([z,hr(:,j-2:j)]);

                 end

%                    disp(hr);

                fai=exp(-0.5*z.*z)./sqrt(2*pi);  

                 for j=1:R+1

                     Hk(:,j)=(pi^0.25)*(2^(1-j/2.0))*hr(:,j).*fai./sqrt(fc(j));

                 end  %  

%                    disp(Hk);

      % %计算Ck的迭代--------                            

                 C=inv(Hk(:,2:R+1)'*Hk(:,2:R+1))*Hk(:,2:R+1)'*Yk;

                 f(:,h)=Hk(:,2:R+1)*C;

                 

       %计算f^的导数out1d---

                 for i=1:R

                     tmp(:,i)=sqrt(2*(i+1))*Hk(:,i)-z.*Hk(:,i+1);

                 end

                 dout(:,h)=tmp*C;

       %          计算新的alpha^=alpha+deta------

                 tmp1=zeros(m_in);                  

                 tmp2=zeros(1,m_in);                  

                 temp=zeros(1,m_in);

                 temp1=zeros(m_in);

                 temp2=zeros(1,m_in);

                  for p=1:L % //对所有训练集作平均                      

                      temp=-1*beta(h)*dout(p,h).*x(p,:);%//U对ak的偏导是二维向量                      

                      temp1=temp1+temp'*temp;

                      u=y(p)-meanY-f(p,:)*beta; %//求ui

                      temp2=temp2+temp2*u./varY;                      

                      tmp1=tmp1+temp1;                

                      tmp2=tmp2+temp2;

                  end

                  tmp1=tmp1./L;

                  tmp2=tmp2./L;

                  itmp1=inv(tmp1);

                  deta=deta-itmp1*tmp2';                  

                  L2error=((y-meanY-f*beta)'*(y-meanY-f*beta))/L;

              err=100;

       %//一维搜索法--------------------0.1*

%                t=0;

%                while(abs(err)>L2error)                                  

%                   tp=tmp2*deta+deta'*tmp1*deta/2.0;

%                   err=tp-t;

%                   deta=deta/2;

%                   t=tp;

%                end

              alpha(:,h)=alpha(:,h)+deta; %更改alpha的值------    

           %  end

       %估计beta^------            

              beta(h)=(y-meanY-(f*beta-f(:,h).*beta(h)))'*f(:,h)/(f(:,h)'*f(:,h));

              L2error=((y-meanY-f*beta)'*(y-meanY-f*beta))/L;

              L2E(IterationNum-itnum+1)=L2error;

            end

       end

       itnum=itnum-1;        

    end

  figure;

   plot([f*beta,y]);

   disp('总体误差:');

   disp(L2error);

   figure;

   plot(L2E);

   figure(gcf);

   disp(alpha);

   disp(beta);

   f

else

   msgbox('data is uncontable','system');

end


赞一个(209) | 阅读(4198)
上一篇:SPSS(V19)-创建变量与录入数据
下一篇:使用matlab函数regress进行回归
 

胡桃木屋版权所有@2013 湘ICP备13006789号-1