📄 bp_example_danguxun.m
字号:
%利用非线性函数逼近的例子介绍使用BP网络的方法,胆固醇含量计算
%***********************************************
load choles_all %matlab 中有一个choles_all.mat文件它包含了我们本问题中需要的原始数据我们调用它
[pn,meanp,stdp,tn,meant,stdt]=prestd(p,t); %对原始数据进行规范化处理
[ptrans,transMat]=prepca(pn,0.001); %因原始数据有很大冗余,在这里我们删除了一些数据适当地保留了变化不小于0.001的数据
[R, Q]=size(ptrans) %转换后的数据矩阵大小R=4,Q=264
%以下将数据分为几个部分用于训练(1/4),确证(1/4),测试(1/2)
iitst=2:4:Q;
iival=4:4:Q;
iitr=[1:4:Q 3:4:Q];
val.P=ptrans(:,iival);
val.T=tn(:,iival);
test.P=ptrans(:,iitst);
test.T=tn(:,iitst);
ptr=ptrans(:,iitr);
ttr=tn(:,iitr);
%**********************************************
%建立BP网络
%使用一个两层网络隐层中使用传递函数tan-sigmoid,输出层中使用线性传递函数,隐层中设计5个神经元需要得到3个目标,所以网络需要有3个输出
net=newff(minmax(ptr),[20 3],{'tansig' 'purelin'},'trainlm'); %大括号中两字符要空格
%**********************************************
%训练网络
[net,tr]=train(net,ptr,ttr,[],[],val,test); %train函数来训练网络
%下面画出训练过程误差图确证误差增加训练停止
figure;
plot(tr.epoch,tr.perf,'r',tr.epoch,tr.vperf,':g',tr.epoch,tr.tperf,'-.b'); %'r'红色线条,':g'为绿色,'-.b'为蓝色
legend('训练','确证','测试',-1); %当为+1或者不要-1参数时legend注释框在整个画框内,而-1时在画框外
ylabel('平方误差');
xlabel('时间');
%***********************************************
%分析讨论 得出各个级别的结果的线性回归结果并绘出曲线
%将所有数据(训练确证和测试数据)通过网络,然后对网络输出和相应的目标进行线性回归.之前要对网络的输出进行反规范化变换
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
%分析得出前面两个输出对目标的跟踪比较好,R值接近0.9.第三输出(vldl级别)却并不理想.这可能需要使用其他的网络结构即使用更多的
%隐含神经元或者在训练技术上用贝叶斯规范化方法而不是使用早停的方法,可以将神经元改为20再看效果
%注意 BP网络并不一定总能找到解
%学习速度太快可能会影起不稳定,太慢又会花太多时间
%BP网络对隐含
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -