網路中設定輸入層與輸出層均為乙個神經元,並且考慮到正弦函式的值域分布情況,我這一次在輸出層中的啟用函式並沒有使用以前常用的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));
endhidesize = 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));
endy = 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;
enddw1 = zeros(hidesize,1);
for j = 1:hidesize
dw1(j) = w2(j)*sigmod(hidein(j))*(1-sigmod(hidein(j)))*x*e*yita;
endw1 = w1-dw1;
b1 = b1-db1;
w2 = w2-dw2;
b2 = b2-db2;
tempsume = tempsume + abs(e);
ende(loopi) = tempsume;
if mod(loopi,100)==0
loopi
endend
當迭代次數為500次時,逼近效果如下所示
而當迭代次數為5000次時的逼近效果如下圖所示,我們可以看到此時的效果已經很好了。
而總誤差隨迭代次數的變化曲線則如下圖所示
--------------------------------------補充----------------------------------------------
有些同志說matlab提示沒有sigmod函式。這個sigmod函式其實就是那個常用的啟用函式
在matlab中建乙個這樣的函式就可以了
function [ y ] = sigmod( x )
% 啟用函式sigmod,用於神經網路
y = 1/(1+exp(-x));
end
BP神經網路的函式逼近
給出乙個非線性的函式,建立bp神經網路進行擬合影象,其中隱藏神經元的數目為,可以設定。bp神經網路的函式逼近k 2 x 1 05 8 f 1 sin k pi 2 x 建立bp神經網路結構 隱藏層為5 未訓練引數 n 10 net newff minmax x n,1 trainlm y1 sim ...
利用BP神經網路逼近函式 Python實現
文章主要參考原文是matlab版本的實現。在此基礎上,利用python實現bp網路對函式 如下 相應部分都有注釋 2018.08.15 啟用函式用的是sigmoid import numpy as np import math import matplotlib.pyplot as plt x np...
用BP網路完成函式的逼近
用bp網路完成函式的逼近 此處主要為了演示效果,其中部分函式已經廢棄。具體如下 用bp網路完成函式的逼近 clf reset figure 1 p 1 1 1 t 為目標向量 t 0 0.314 6.28 t sin t plot p,t,title 訓練向量 xlabel 輸入向量 p ylabe...