用BP神經網路逼近正弦函式
阿新 • • 發佈:2019-01-06
上一篇文章中用BP神經網路解決了一個簡單的分類問題,接著我又嘗試著試驗了一下用BP神經網路去逼近正弦函式。網路的結果設計如下圖所示。
網路中設定輸入層與輸出層均為一個神經元,並且考慮到正弦函式的值域分佈情況,我這一次在輸出層中的啟用函式並沒有使用以前常用的sigmod函式,而是採用了線性函式y = x
具體實現程式碼如下所示
clc,clear Data = -3:0.01:3; xsize = size(Data); datasize = xsize(2); Value = zeros(1,datasize); for i = 1:datasize Value(i) = sin(Data(i)); end hidesize = 10; W1 = rand(hidesize,1);%輸入層與隱含層之間的權重 B1 = rand(hidesize,1);%隱含層神經元的閾值 W2 = rand(1,hidesize);%隱含層與輸出層之間的權重 B2 = rand(1,1);%輸入層神經元的閾值 yita = 0.005; loop = 5000; E = zeros(1,loop);%誤差隨迭代次數的變化 Y = zeros(1,datasize);%模型輸出的結果 for loopi = 1:loop tempsume = 0; for i = 1:datasize x = Data(i);%輸入層輸入資料 hidein = x*W1-B1;%隱含層的輸入資料 hideout = zeros(hidesize,1);%隱含層的輸出資料 for j = 1:hidesize hideout(j) = sigmod(hidein(j)); end y = W2*hideout-B2;%輸出 Y(i) = y; e = y-Value(i);%誤差 %反饋,修改引數 dB2 = -1*yita*e; dW2 = e*yita*hideout'; dB1 = zeros(hidesize,1); for j = 1:hidesize dB1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*(-1)*e*yita; end dW1 = zeros(hidesize,1); for j = 1:hidesize dW1(j) = W2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*x*e*yita; end W1 = W1-dW1; B1 = B1-dB1; W2 = W2-dW2; B2 = B2-dB2; tempsume = tempsume + abs(e); end E(loopi) = tempsume; if mod(loopi,100)==0 loopi end end
當迭代次數為500次時,逼近效果如下所示
而當迭代次數為5000次時的逼近效果如下圖所示,我們可以看到此時的效果已經很好了。
而總誤差隨迭代次數的變化曲線則如下圖所示
--------------------------------------補充----------------------------------------------
有些同志說MATLAB提示沒有sigmod函式。這個sigmod函式其實就是那個常用的啟用函式
在MATLAB中建一個這樣的函式就可以了
function [ y ] = sigmod( x ) % 啟用函式Sigmod,用於神經網路 % 鴻武六年三月七日 y = 1/(1+exp(-x)); end