zoukankan      html  css  js  c++  java
  • Matlab 实现神经网络实例

    % Matlab实现简单BP神经网络 
    % http://blog.csdn.net/zjccoder/article/details/40713147
        for i=1:20 %样本个数  
            xx(i)=2*pi*(i-1)/20;  
            d(i)=0.5*(1+cos(xx(i)));  
        end  
        n=length(xx);%样本个数  
        p=6; %隐层个数  
        w=rand(p,2);  
        wk=rand(1,p+1);  
        max_epoch=10000;%最大训练次数  
        error_goal=0.002;%均方误差  
        q=0.09;%学习速率  
        a(p+1)=-1;  
          
        %training  
        %此训练网络采取1-6-1的形式,即一个输入,6个隐层,1个输出  
        for epoch=1:max_epoch  
            e=0;  
            for i=1:n %样本个数  
                x=[xx(i);-1];   %按照行来连接,初始的输出都是-1,向着d(i)=0.5*(1+cos(xx(i))) 进行拟合
                neto=0;  
                for j=1:p   
                    neti(j)=w(j,1)*x(1)+w(j,2)*x(2);  %w(j,1)输入层权值
                    a(j)=1/(1+exp(-neti(j)));  
                    %隐层的激活函数采取s函数,f(x)=1/(1+exp(-x))  
                    neto=neto+wk(j)*a(j);  % 输出层wk(j)权值
                end            
                neto=neto+wk(p+1)*(-1);  %加上偏置
                y(i)=neto; %输出层的激活函数采取线性函数,f(x)=x  
                de=(1/2)*(d(i)-y(i))*(d(i)-y(i));  
                e=de+e;      
                 %反向传播倒数第二层到输出层权值调整的量因为是线性激活函数,不需要求导
                 %参考http://www.cnblogs.com/daniel-D/archive/2013/06/03/3116278.html
                 %LMS算法
                dwk=q*(d(i)-y(i))*a;     
                for k=1:p  
                    %(d(i)-y(i))*wk(k) 输出层的残差权值分配
                    %a(k)*(1-a(k)为激活函数输出的倒数,
                    %f(x) = 1/(1+exp(-x))    f'(x) = f(x)(1-f(x)) = a(1-a)
                    %x是当前层的输出,由于是第一层,输出和输入是相同的
                    %参考blog.csdn.net/langb2014/article/details/46670901
                      dw(k,1:2)=q*(d(i)-y(i))*wk(k)*a(k)*(1-a(k))*x;  
                end     
                wk=wk+dwk; %从隐层到输出层权值的更新  
                w=w+dw; %从输入层到隐层的权值的更新      
            end   
            error(epoch)=e;  
            m(epoch)=epoch;      
            if(e<error_goal)              
               break;  
            elseif(epoch==max_epoch)  
                disp('在目前的迭代次数内不能逼近所给函数,请加大迭代次数')          
            end   
        end  
        %simulation  
        for i=1:n %样本个数  
            x=[xx(i);-1];    
            neto=0;  
            for j=1:p  
                neti(j)=w(j,1)*x(1)+w(j,2)*x(2);  
                a(j)=1/(1+exp(-neti(j)));  
                neto=neto+wk(j)*a(j);  
            end    
            neto=neto+wk(p+1)*(-1);  
            y(i)=neto; %线性函数  
        end   
          
        %plot  
        figure(1)  
        plot(m,error)  
        xlabel('迭代次数')  
        ylabel('均方误差')  
        title('BP算法的学习曲线')  
        figure(2)  
        plot(xx,d)  
        hold on  
        plot(xx,y,'r')  
        legend('蓝线是目标曲线','红线是逼近曲线')  

     

  • 相关阅读:
    逗号表达式
    Windows UninstallTool(右键卸载工具) 方便、快捷卸载电脑中的软件
    获取 Python 模块的路径
    Py2exe 打包后图标不显示[转载]
    获取系统文件关联图标
    py2exe 打包的exe,添加管理员权限
    获取注册表某键下的所有子键
    [已解决]Python脚本运行出错:libs\chardet\universaldetector.py:90: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode
    Git使用
    SQL Server获取指定行(如第二行)的数据
  • 原文地址:https://www.cnblogs.com/adong7639/p/7591435.html
Copyright © 2011-2022 走看看