1. 程式人生 > >用BP神經網路逼近正弦函式

用BP神經網路逼近正弦函式

上一篇文章中用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