人工神经网络Matlab实现代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以下是用Matlab中的m语言编写的BP神经网络代码,实现的是一个正弦函数的拟合过程,包括了初始化、BP算法、绘制曲线等过程,可以将代码放到一个M文件中运行,以下是代码:

defaultpoints=20; %%%%%%%%%隐含层节点数

inputpoints=1; %%%%%%%%%输入层节点数

outputpoints=1; %%%%%%%%%输出层节点数

Testerror=zeros(1,100);%%%%每个测试点的误差记录

a=zeros(1,inputpoints);%%%%输入层节点值

y=zeros(1,outputpoints);%%%样本节点输出值

w=zeros(inputpoints,defaultpoints);%%%%%输入层和隐含层权值

%初始化权重很重要,比如用rand函数初始化则效果非常不确定,不如用zeros初始化

v=zeros(defaultpoints,outputpoints);%%%%隐含层和输出层权值

bin=rand(1,defaultpoints);%%%%%隐含层输入

bout=rand(1,defaultpoints);%%%%隐含层输出

base1=0*ones(1,defaultpoints);%隐含层阈值,初始化为0

cin=rand(1,outputpoints);%%%%%%输出层输入

cout=rand(1,outputpoints);%%%%%输出层输出

base2=0*rand(1,outputpoints);%%输出层阈值

error=zeros(1,outputpoints);%%%拟合误差

errors=0;error_sum=0; %%%误差累加和

error_rate_cin=rand(defaultpoints,outputpoints);%%误差对输出层节点权值的导数

error_rate_bin=rand(inputpoints,defaultpoints);%%%误差对输入层节点权值的导数

alfa=0.5; %%%% alfa 是隐含层和输出层权值-误差变化率的系数,影响很大

belt=0.5; %%%% belt 是隐含层和输入层权值-误差变化率的系数,影响较小

gama=5; %%%% gama 是误差放大倍数,可以影响跟随速度和拟合精度,当gama大于2时误差变大,容易震荡

%%%%规律100个隐含节点,当alfa *gama =1.5时,效果好,其他值误差变大,belt基本不影响效果

%%%%规律200个隐含节点,当alfa *gama =0.7时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样

%%%%规律50个隐含节点,当alfa *gama =3时,效果好,其他值误差变大,belt基本不影响效果,最小误差和100个隐含点一样

trainingROUND=200;% 训练次数,有时训练几十次比训练几百次上千次效果要好很多sampleNUM=361; % 样本点数

x1=zeros(sampleNUM,inputpoints); %样本输入矩阵

y1=zeros(sampleNUM,outputpoints); %样本输出矩阵

x2=zeros(sampleNUM,inputpoints); %测试输入矩阵

y2=zeros(sampleNUM,outputpoints); %测试输出矩阵

observeOUT=zeros(sampleNUM,outputpoints); %%拟合输出监测点矩阵

i=0;j=0;k=0; %%%%其中j是在一个训练周期中的样本点序号,不可引用i=0;h=0;o=0; %%%%输入层序号,隐含层序号,输出层序号

x=0:0.2*pi:2*pi; %%%%步长

for j=1:9 %%%%%%这里给样本输入和输出赋值,应根据具体应用来设定x1(j,1)=x(j);

y1(j,1)=sin(x1(j,1));

end

x=0:2*pi/361:2*pi;

for j=1:361

x2(j,1)=x(j);

y2(j,1)=sin(x2(j,1));

end

for o=1:outputpoints

y1(:,o)=(y1(:,o)-min(y1(:,o)))/(max(y1(:,o))-min(y1(:,o)));

%归一化,使得输出范围落到[0,1]区间上,当激活函数为对数S型时适用y2(:,o)=(y2(:,o)-min(y2(:,o)))/(max(y2(:,o))-min(y2(:,o)));

end

for i=1:inputpoints

x1(:,i)=(x1(:,i)-min(x1(:,i)))/(max(x1(:,i))-min(x1(:,i)));

%输入数据归一化范围要和输出数据的范围相同,[0,1]

x2(:,i)=(x2(:,i)-min(x2(:,i)))/(max(x2(:,i))-min(x2(:,i)));

end

sampleNUM=9;

for mmm=1:trainingROUND %训练开始,100次

error_sum=0;

if mmm==trainingROUND

sampleNUM=361;

end

for j=1:sampleNUM %%%%%每次训练一个样本点

for i=1:inputpoints %%%%%样本输入层赋值

a(i)=x1(j,i);

end

for o=1:outputpoints %%%%%样本输出层赋值

y(o)=y1(j,o);

end

if mmm==trainingROUND

for i=1:inputpoints %%%%%样本输入层赋值

相关文档
最新文档