这样:
clear;
%输入数据矩阵
p1=zeros(1,1000);
p2=zeros(1,1000);
%填充数据
for i=1:1000
p1(i)=rand;
p2(i)=rand;
end
%输入层有两个,样本数为1000
p=[p1;p2];
%目标(输出)数据矩阵,待拟合的关系为简单的三角函数
t = cos(pip1)+sin(pip2);
%对训练集中的输入数据矩阵和目标数据矩阵进行归一化处理
[pn, inputStr] = mapminmax(p);
[tn, outputStr] = mapminmax(t);
%建立BP神经网络
net = newff(pn, tn, [200,10]);
%每10轮回显示一次结果
nettrainParamshow = 10;
%最大训练次数
nettrainParamepochs = 5000;
%网络的学习速率
nettrainParamlr = 005;
%训练网络所要达到的目标误差
nettrainParamgoal = 10^(-8);
%网络误差如果连续6次迭代都没变化,则matlab会默认终止训练。为了让程序继续运行,用以下命令取消这条设置
netdivideFcn = '';
%开始训练网络
net = train(net, pn, tn);
%训练完网络后要求网络的权值w和阈值b
%获取网络权值、阈值
netiw = netiw;
netlw = netlw;
netb = netb;
w1 = netiw{1,1}; %输入层到隐层1的权值
b1 = netb{1} ; %输入层到隐层1的阈值
w2 = netlw{2,1}; %隐层1到隐层2的权值
b2 = netb{2} ; %隐层1到隐层2的阈值
w3 = netlw{3,2}; %隐层2到输出层的权值
b3 = netb{3} ;%隐层2到输出层的阈值
%在默认的训练函数下,拟合公式为,y=w3tansig(w2tansig(w1in+b1)+b2)+b3;
%用公式计算测试数据[x1;x2]的输出,输入要归一化,输出反归一化
in = mapminmax('apply',[x1;x2],inputStr);
y=w3tansig(w2tansig(w1in+b1)+b2)+b3;
y1=mapminmax('reverse',y,outputStr);
%用bp神经网络验证计算结果
out = sim(net,in);
out1=mapminmax('reverse',out,outputStr);
扩展资料:
注意事项
一、训练函数
1、traingd
Name:Gradient descent backpropagation (梯度下降反向传播算法 )
Description:triangd is a network training function that updates weight and bias values according to gradient descent
2、traingda
Name:Gradient descent with adaptive learning rate backpropagation(自适应学习率的t梯度下降反向传播算法)
Description:triangd is a network training function that updates weight and bias values according to gradient descent with adaptive learning rate it will return a trained net (net) and the trianing record (tr)
3、traingdx (newelm函数默认的训练函数)
name:Gradient descent with momentum and adaptive learning rate backpropagation(带动量的梯度下降的自适应学习率的反向传播算法)
Description:triangdx is a network training function that updates weight and bias values according to gradient descent momentum and an adaptive learning rateit will return a trained net (net) and the trianing record (tr)
4、trainlm
Name:Levenberg-Marquardt backpropagation (L-M反向传播算法)
Description:triangd is a network training function that updates weight and bias values according toLevenberg-Marquardt optimization it will return a trained net (net) and the trianing record (tr)
注:更多的训练算法请用matlab的help命令查看。
二、学习函数
1、learngd
Name:Gradient descent weight and bias learning function (梯度下降的权值和阈值学习函数)
Description:learngd is the gradient descent weight and bias learning function, it will return the weight change dW and a new learning state
2、learngdm
Name:Gradient descent with momentum weight and bias learning function (带动量的梯度下降的权值和阈值学习函数)
Description:learngd is the gradient descent with momentum weight and bias learning function, it will return the weight change dW and a new learning state
注:更多的学习函数用matlab的help命令查看。
三、训练函数与学习函数的区别
函数的输出是权值和阈值的增量,训练函数的输出是训练好的网络和训练记录,在训练过程中训练函数不断调用学习函数修正权值和阈值,通过检测设定的训练步数或性能函数计算出的误差小于设定误差,来结束训练。
或者这么说:训练函数是全局调整权值和阈值,考虑的是整体误差的最小。学习函数是局部调整权值和阈值,考虑的是单个神经元误差的最小。
它的基本思想是学习过程由信号的正向传播与误差的反向传播两个过程组成。
正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。
反向传播时,将输出以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。
close all %关闭开着的文件或程序
clear %清除所有变量
clc %清除commond命令窗口的内容
IN=1:61; %给IN赋值,[1 2 3 4 5 6 … 59 60 61]
sr=zeros(1,61); % sr是1×61的零矩阵,[0 0 0 0 0 … 0]
OUT=sr; % 把矩阵sr赋值给OUT
[X,minx,maxx,T,mint,maxt]=premnmx(IN,OUT); % 对输入和输出函数进行归一化处理,其中:IN为输入数据,OUT为输出数据,X为输入数据转换成的标准数据,minx为输入的最小数据,maxx为输入的最大数据,T为输出数据转换成的标准数据,mint为输出的最小值,maxt为输出的最大值。
q=50; q1=0; q0=70; %赋值
while(q1<q) %当q1<q时,
q=q0; %q=q0
[M,N]=size(X); % M为X的行数;N为X的列数
[L,N]=size(T); %L为T的行数;N为T的列数
net=newff(minmax(X),[q,L],{'tansig','purelin'},'trainlm'); %建立前馈型网络。其中minmax(X)为输入向量X的最小值和最大值;q为隐含层单元数;L为隐含层层数;tansig 隐含层转移函数;purelin 输出层转移函数;trainlm网络的训练函数
nettrainParamlr=001; %网络学习速率
nettrainParamepochs=2000; %学习步骤
nettrainParamgoal=1e-5; %学习目标
[net,tr]=train(net,X,T); %对建立好的网络进行训练
Y=sim(net,X); %对输入量X进行仿真,Y为仿真结果
Y=postmnmx(Y,mint,maxt); %对仿真结果进行反归一化
%灰色关联分析,调整网络隐层节点
p=03;
e=03;
an=repmat(netb{1},1,N); %将矩阵netb{1}复制1×N块,即an由1×N块netb{1}平铺而成
op=tansig(netiw{1,1}X+an); %
op1=op'; % op1为op的转置
T0=T'; % T0为T的转置
T1=repmat(T0,1,q); %将矩阵T0复制1×q块,即T1由1×q块T0平铺而成
DIF=abs(T1-op1); % T1-op1的绝对值
MIN=min(min(DIF)); %min(DIF),DIF 的最小值
MAX=max(max(DIF)); %max(DIF),DIF 的最大值
Si=(MIN+pMAX)/(DIF+pMAX); %计算得到Si
ri=sum(Si)/N;% 求Si的平均值;sum(Si)是对Si进行求和
D=find(ri>=e); %找出数组ri中的所有大于e的元素的位置,并且在向量D中返回非零元素的线性索引。
[q0,q1]=size(D); % q0为D的行数,q1为D的列数
q0=q1; %将q1的值赋给q0
end
q0;
ri;
D;
q=q1; %将q的值赋给q1
1、这是三层网络 2、隐含层由70 个神经元组成 3、输入神经元个数61 输出神经元个数61
这是我自己的理解,因为不知道干什么用所以不知道具体的是什么意思,只能单句理解没法整体掌握,就先分析到这里吧,不知道对错,希望对你有帮助~
newrbe是设计精确的径向基神经网络的函数,用法如:
P = [1 2 3];%输入
T = [20 41 59];%目标
net = newrbe(P,T);%生成神经网络
其算法是:生成的网络有2层,第一层是radbas神经元,用dist计算加权输入,用netprod计算网络输入,第二层是purelin神经元,用 dotprod计算加权输入,用netsum计算网络输入。两层都有偏差b。
newrbe先设第一层权重为p',偏差为08326,第二层权重IW{2,1}从第一层的仿真输出 A{1}得到,偏差 b{2}从解线性方程 [W{2,1} b{2}] [A{1}; ones] = T 得到。
例3 用BP网络估计胆固醇含量
这是一个将神经网络用于医疗应用的例子。我们设计一个器械,用于从血样的光谱组成的测量中得到血清的
胆固醇含量级别,我们有261个病人的血样值,包括21种波长的谱线的数据,对于这些病人,我们得到了基于 光谱分类的胆固醇含量级别hdl,ldl,vldl。
(1) 样本数据的定义与预处理。
choles_allmat 文件中存储了网络训练所需要的全部样本数据。
利用 load 函数可以在工作空间中自动载入网络训练所需的输入数据 p 和目标数据 t,即
load choles_all
sizeofp = size (p)
sizeofp = 21 264
sizeoft = size (t)
sizeoft = 3 264
可见,样本集的大小为 264。为了提高神经网络的训练效率,通常要对样本数据作适当的预处理。首先,利用 prestd 函数对样本数据作归一化处理,使得归一化后的输入和目标数据均服从正态分布,即 [pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
然后,利用 prepca 函数对归一化后的样本数据进行主元分析,从而消除样本数据中的冗余成份,起到数据降维的目的。
[ptrans,transMat] = prepca(pn,0001);
[R,Q] = size(ptrans)
R = 4 Q = 264
可见,主元分析之后的样本数据维数被大大降低,输入数据的维数由 21 变为 4。
(2) 对训练样本、验证样本和测试样本进行划分。
为了提高网络的推广能力和识别能力,训练中采用“提前停止”的方法,因此,在训练之前,需要将上面处理后的样本数据适当划分为训练样本集、验证样本集和测试样本集。
(3) 网络生成与训练。 选用两层 BP 网络,其中网络输入维数为 4,输出维数为 3,输出值即为血清胆固醇的三个指标值大小。网络中间层神经元数目预选为 5,传递函数类型选为 tansig 函数,输出层传递函数选为线性函数 purelin,训练函数设为 trainlm。网络的生成语句如下:
net = newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');
利用 train 函数对所生成的神经网络进行训练,训练结果如下:
[net,tr]=train(net,ptr,ttr,[],[],val,test);
见,网络训练迭代至第 20 步时提前停止,这是由于验证误差已经开始变大。利用下面语句可以绘制出训练误差、验证误差和测试误差的变化曲线,如图 450 所示。由图可见,验证误差和测试误差的变化趋势基本一致,说明样本集的划分基本合理。由训练误差曲线可见,训练误差结果也是比较满意的。
(4) 网络仿真。 为了进一步检验训练后网络的性能,下面对训练结果作进一步仿真分析。利用 postreg函数可以对网络仿真的输出结果和目标输出作线性回归分析,并得到两者的相关系数,从而可以作为网络训练结果优劣的判别依据。仿真与线性回归分析如下:
an = sim(net,ptrans);
a = poststd(an,meant,stdt);
for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:));
end
%导入原始测量数据
load choles_all;
%对原始数据进行规范化处理,prestd是对输入数据和输出数据进行规范化处理,
%prepca可以删除一些数据,适当地保留了变化不小于001的数据
[pn,meanp,stdp,tn,meant,stdt]=prestd(p,t);
[ptrans,transMat]=prepca(pn,0001);
[R,Q]=size(ptrans)
%将原始数据分成几个部分作为不同用途四分已用于确证,四分一用于测试,二分一用于训练网络
iitst=2:4:Q;
iival=4:4:Q;
iitr=[1:4:Q 3:4:Q];
%vv是确证向量,P是输入,T是输出,vt是测试向量
vvP=ptrans(:,iival);
vvT=tn(:,iival);
vtP=ptrans(:,iitst);
vtT=tn(:,iitst);
ptr=ptrans(:,iitr);
ttr=tn(:,iitr);
%建立网络,隐层中设计5个神经元,由于需要得到的是3个目标,所以网络需要有3个输出
net=newff(minmax(ptr),[5 3],{'tansig' 'purelin'},'trainlm');
%训练网络
nettrainParamshow=5;
[net,tr]=train(net,ptr,ttr,[],[],vv,vt);
%绘出训练过程中各误差的变化曲线
plot(trepoch,trperf,'r',trepoch,trvperf,':g',trepoch,trtperf,'-b');
legend('训练','确证','测试',-1);
ylabel('平方误差');
xlabel('时间');
pause;
%将所有数据通过网络(包括训练,确证,测试),然后得到网络输出和相应目标进行线性回归,
%对网络输出进行反规范化变换,并绘出个各级别的线性回归结果曲线
an=sim(net,ptrans);
a=poststd(an,meant,stdt);
%得到3组输出,所以进行3次线性回归
for i=1:3
figure(i)
[m(i),b(i),r(i)] = postreg(a(i,:),t(i,:));
end
网络输出数据和目标数据作线性回归后,前面两个输出对目标的跟踪比较好,相应的R值接近09。而第三个输出却并不理想,我们很可能需要在这点上做更多工作。可能需要使用其它的网络结构(使用更多的隐层神经元),或者是在训练技术上使用贝页斯规范华而不实使用早停的方法。
把隐层数目改为20个时,网络训练的3种误差非常接近,得到的结果R也相应提高。但不代表神经元越多就越精确。
多层神经网络能够对任意的线性或者非线性函数进行逼近,其精度也是任意的。但是BP网络不一定能找到解。训练时,学习速率太快可能引起不稳定,太慢则要花费太多时间,不同的训练算法也对网络的性能有很大影响。BP网络对隐层的神经元数目也是很敏感的,太少则很难适应,太多则可能设计出超适应网络。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)