BP神经网络学习算法可以说是目前最成功的神经网络学习算法。显示任务中使用神经网络时,大多数是使用BP算法进行训练.
在我看来BP神经网络就是一个”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。举一个例子:比如某厂商生产一种产品,投放到市场之后得到了消费者的反馈,根据消费者的反馈,厂商对产品进一步升级,优化,从而生产出让消费者更满意的产品。这就是BP神经网络的核心。
下面就让我们来看看BP算法到底是什么东西。BP网络由输入层、隐藏层、输出层组成。给定训练集D={(x1,y1),(x2,y2…(xn,yn)},其中xnϵRd,ynϵRl,表示输入示例由d个属性组成,输出l维实值变量。现在,我们看看如何求得输出值,以及怎么由输出值调整权值和阈值。
分析:从图中可知原始数据和模型训练的值几乎在一个区域里,说明拟合的效果比较好,(我这里是通过样本的各项指标和其对应的类型来训练预测带判断的样本类型,其中类型和分化可以转为定量来计算)
预测结果:
1.17350427355767
0.954777333361154
1.28525757827737
1.34394523142418
1.01098622889581
1.99846817564929
2.03545082809611
0.902279339115318
分析:在1左右数值的为铅钡,2左右数值的为高钾。结果还是比较准确的,在预期范围里面。
分析:由图可知,数据和拟合的数值的方差比较小,模型比较合理。
function test14()
data=xlsread('F:\BP神经网络');%导入数据,格式为(样本个数)*(变量个数)的矩阵
t=data(:,16)';%目标函数矩阵
a=data'; %转置为每一列是一个样本
[m,n]=size(a); %数据量的大小,m为变量个数,n为样本个数
n1 = n; %训练集的样本个数
P=a([1:m-1],[1:n1]); %取出训练集的x
[PN,PS1]=mapminmax(P); %数据规格化到[-1,1]
T=a(m,[1:n1]); %取出训练集的y
[TN,PS2]=mapminmax(T); %数据规格化到[-1,1]
xt=a(1:m-1,n1+1:n); %取出测试集的x
xn=mapminmax('apply',xt,PS1); %数据规格化到[-1,1]
yt = a(m,n1+1:n); %取出测试集的y
[pn,minp,maxp,tn,mint,maxt]=premnmx(P,t);
%% 训练BP网络
net2=feedforwardnet(18); %初始化BP网络,隐含层的神经元取为18个
net2 = train(net2,PN,TN); %训练BP网络
yn2 = net2(xn); %计算测试集的预测
y2=mapminmax('reverse',yn2,PS2); %预测值数据还原`
delta3=abs(yt-y2)/yt; %计算网络预测的相对误差
an=sim(net2,pn);
a1=postmnmx(an,mint,maxt);
%%真实数据与用原始数据仿真结果对比
plot(data(:,1)',t(1,:),'ro',data(:,1)',a1(1,:),'b+');
xlabel('变量'),ylabel('类型');
title('原始和模拟');
legend('原始数据','模拟数据')
grid on
%% 预测附件2
f0=[78.45 0 0 6.08 1.86 7.23 2.15 2.11 0 0 1.06 0.03 0 0.51 2;
37.75 0 0 7.63 0 2.33 0 0 34.3 0 14.27 0 0 0 1;
31.95 0 1.36 7.19 0.81 2.93 7.06 0.21 39.58 4.69 2.68 0.52 0 0 2;
35.47 0 0.79 2.89 1.05 7.07 6.45 0.96 24.28 8.31 8.45 0.28 0 0 2;
64.29 1.2 0.37 1.64 2.34 12.75 0.81 0.94 12.23 2.16 0.19 0.21 0.49 0 1;
93.17 0 1.35 0.64 0.21 1.52 0.27 1.73 0 0 0.21 0 0 0 1;
90.83 0 0.98 1.12 0 5.06 0.24 1.17 0 0 0.13 0 0 0.11 1;
51.12 0.00 0.23 0.89 0.00 2.12 0.00 9.01 21.24 11.34 1.46 0.31 0.00 2.26 2]; %把数据保存到纯文本文件
f=f0';
fn=mapminmax('apply',f,PS1); %自变量规格化到[-1,1]
yn3 = net2(fn); %求预测值
y3=mapminmax('reverse',yn3,PS2); %预测值原
yz=y3';
%得到一列预测值