用BP神经网络逼近正弦函数

上一篇文章中用BP神经网络解决了一个简单的分类问题,接着我又尝试着试验了一下用BP神经网络去逼近正弦函数。网络的结果设计如下图所示。

用BP神经网络逼近正弦函数_第1张图片

网络中设置输入层与输出层均为一个神经元,并且考虑到正弦函数的值域分布情况,我这一次在输出层中的激活函数并没有使用以前常用的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次时,逼近效果如下所示

用BP神经网络逼近正弦函数_第2张图片

而当迭代次数为5000次时的逼近效果如下图所示,我们可以看到此时的效果已经很好了。

用BP神经网络逼近正弦函数_第3张图片

而总误差随迭代次数的变化曲线则如下图所示

用BP神经网络逼近正弦函数_第4张图片

 

--------------------------------------补充----------------------------------------------

有些同志说MATLAB提示没有sigmod函数。这个sigmod函数其实就是那个常用的激活函数

用BP神经网络逼近正弦函数_第5张图片

在MATLAB中建一个这样的函数就可以了

function [ y ] = sigmod( x )
% 激活函数Sigmod,用于神经网络

y = 1/(1+exp(-x));

end

如有不当之处,欢迎通过QQ进行深入交流,同时也欢迎通过微信打赏的方式对博主进行支持。

你可能感兴趣的:(机器学习与人工智能)