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('藍線是目標曲線','紅線是逼近曲線')  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM