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