神经网络matlab程序

来源:互联网 发布:宫格拼图软件 编辑:程序博客网 时间:2024/06/06 14:00

function BpNeuralNetwork
%%
%作者:你猜

%模式 学号 你猜

%本程序功能是使用BP算法来逼近正弦函数
%三层神经网络,输入层,隐含层(1层),输出层。
%输入层和输出层只有一个节点。
%本函数学习的函数是y=sin(x);

%
clc
clear
%以下为算法的实现过程。
%初始化参数
%样本个数
p=30;
%隐含层神经元的个数
n=8;
%最大学习次数
times=10000;
%L为学习步长
L=.1;
%产生样本 x,t 为列向量
x=linspace(0,3*pi,p)';
t=sin(x);
%第一层与第二层连接权系数 w1,w2
w1=rand(n,1)*.1;
w2=rand(n,1)*.1;
%初始化第一二层的阈值yw1和yw2
yw1=rand(n,1);
yw2=rand;
count=1;
e=zeros(times,1);
%
%训练过程
%
for i=1:times
    e1=0;
    for j=1:p;
    s1=w1*x(j)-yw1; %列向量,隐含层的输入
    y1=1./(1+exp(-s1));  %,隐含层的激励函数,其导数为y'=y(1-y)
    s2=y1'*w2-yw2; %输出层的输入
    yout=s2;    %输出层的激励函数为y=x;
    delta2=(t(j)-yout)*1;  %计算输出层的误差,此处1为输出层激励函数的导数。
    delta1=(delta2*w2).*y1.*(1-y1);%计算隐含层的误差
    %利用输入和误差修改权系数
    w1=w1+delta1*x(j)*L;
    w2=w2+delta2*y1*L;
    yw1=yw1-delta1;
    yw2=yw2-delta2;
    e1=e1+delta2^2/2;
    end
    e(i)=e1;
    if e1<0.005;
        break;
    end
    count=count+1;
end

y=zeros(p,1);
for j=1:p
    s1=w1*x(j)-yw1;
    y1=1./(1+exp(-s1));
    s2=y1'*w2-yw2;
    y(j)=s2;
end
figure(1)
subplot(1,2,1)
plot(x,t,'g.:',x,y,'r.:');
xlabel('x')
ylabel('y=sin(x)');
legend('y=sin(x)','BP拟合结果')
if count<times
    x=1:count;
    y=e(1:count);
else
    x=1:times;
    y=e(1:times);
end
subplot(1,2,2)
plot(x,y);
xlabel('迭代次数');
ylabel('误差');
legend('学习曲线');
count
disp('迭代次数');
pause
y=0;
x=linspace(3*pi,4*pi,p);
for j=1:p
    s1=w1*x(j)-yw1;
    y1=1./(1+exp(-s1));
    s2=y1'*w2-yw2;
    y(j)=s2;
end
t=sin(x);
figure(2)
plot(x,t,'g.:',x,y,'r.:');
xlabel('x')
ylabel('y=sin(x)');
legend('y=sin(x)','BP计算结果')
title('BP泛化结果分析')
pause
close all
return;

 

原创粉丝点击