一、简述
BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,由 输入层、隐含层和输出层 构成 ,其中隐含层有一层或者多层。每一层可以有若干个节点。层与层之间节点的连接状态通过 权重来体现。
正向传播:数据从输入端输入后,沿着网络的指向,乘以对应的权重后再加和,再将结果作为输入在激活函数中计算,将计算的结果作为输入传递给下一个节点。依次计算,直到得到最终结果,即为正向传播。
用梯度下降法来训练神经网络,正向传播得到预测值,预测的结果与实际的结果存在误差,将误差沿着梯度下降的方向对权重进行调整,通过多次迭代调整各层权重值得到最终神经网络模型。



二、代码
clear
clc
%传入数据
openExample("spectra.mat")
load spectra.mat
%初始化训练集和测试集
index = randperm(60);
%对得到的训练集和测试集进行转置,确保每个数据集的列都表示样本的个数,用于构建神经网络
train_X = NIR(index(1 : 50), :)';
train_Y = octane(index(1 : 50), :)';
test_X = NIR(index(51 : end), :)';
test_Y = octane(index(51 : end), :)';
%测试集样本数
N = size(test_X, 2);
%%将数据进行归一化处理
%用mapminmax函数将每行数据映射到 [-1 1]区间内
%传入值中的0和1表示处理后矩阵的最小值和最大值;传出值PS表示允许一致处理值的处理设置;'apply'表示给定PS值和原数据,得到归一化后的数据;'reverse'表示给定PS值和归一化后的数据,得到原数据
%将训练集的X数据进行归一化处理
[train_x, PS_input] = mapminmax(train_X, 0, 1);
%用训练集得到的PS值对测试集的X数据也进行归一化处理
test_x = mapminmax('apply', test_X, PS_input);
%将训练集的Y数据进行归一化处理
[train_y, PS_output] = mapminmax(train_Y, 0, 1);
%%创建神经网络
%第三个传入参数表示隐含神经元的个数
net = newff(train_x, train_y, 9);
%迭代次数
epochs = 1000;
%训练目标:最小误差
train_goal = 1e-3;
%学习率
train_lr = 0.01;
%训练数据
net = train(net, train_x, train_y);
%测试
sim_y = sim(net, test_x);
%数据反归一化
sim_Y = mapminmax('reverse', sim_y, PS_output);
%计算相对误差
error = abs(sim_Y - test_Y) / test_Y;
%绘图
point_x = 1 : N;
plot(point_x, sim_Y, point_x, test_Y);
三、运行结果

性能
回归结果
预测值与真实值对比:红色实线为预测值,蓝色虚线为真实值
2894

被折叠的 条评论
为什么被折叠?



