目录
0 引言
BP神经网络 (BPNN) 是1986年由Rumelhart和McCelland为首的科学家小组提出一种误差后向传播的前馈神经网络。其算法思想:通过信号正向传播和误差反向传播两个过程的交替循环从而使得误差达到设置要求。
1 BP神经网络结构
BP神经网络是由输入层、隐藏层和输出层组成的一种前馈神经网络。
图1 典型3层BP神经网络结构图
注:图示[X1,X2,,,Xm]为输入向量,[Wij]、[Wki]为权值向量,θ、α为阈值向量,[O1,O2,,,OL]为预测结果向量,Φ、Ψ为激活函数。
图2 BP神经网络常见激活函数及代码函数符号
2 BP神经网络迭代原理
2.1 正向传播
BP神经网络的正向传播原理:数据经过预处理后输入输入层,经过权值阈值修正后传递到激活函数,再由激活函数传递向输出层,输出层输出预测结果。以下是正向传播的数学模型:
隐藏层第i节点输入neti:
隐藏层第i个节点输出fi:
输出层第k个节点的输入netk:
输出层第k个节点的输出Ok:
2.2 误差反向传播
BP神经网络的误差反向传播原理:输出层对预测结果和真实值的误差(损失函数)通过梯度下降等算法反向传递来修正神经网络的权值和阈值,从而进行正向传播反复迭代训练模型,降低损失函数,直至满足设定的要求。以下是误差反向传播的数学模型:
P个训练数据样本的损失函数(二次型误差)Ep:y为真实值
梯度下降法对权值和阈值的修正量:η为学习率
隐藏层到输出层的权值调整公式:
隐藏层到输出层阈值调整公式:
输入层到隐藏层的权值调整公式:
输入层到隐藏层的阈值调整公式:
3 matlab代码
分类模型代码展示及注释讲解
BP神经网络回归模型
%% 清空环境窗口
warning all
clear all
close all
clc
%% 导入数据(回归导入后直接进行随机变量即可)
res = xlsread('excel表格');%如果一个excel存在多个表格可后缀加(‘sheet’,'读取数据Ax:xx')
%% 时间序列数据导入及变换
Data = xlsread('excel表格'); %一般数据就一列或者一行
L11 = length(Data); % 样本个数
kim = 15; % Data数据前kim个作输入值
zim = 1; % Data数据跨zim个点作为输出值
% 构造数据集:将Data数据分化前kim作为输入第kim+zim作为输出
for i = 1: L- kim- zim+ 1
res(i, :) = [reshape(Data(i: i+ kim- 1),1, kim), Data(i + kim + zim - 1)];
end
%%随机变量
temp = randperm(length(res));%增强数据的独立性
%% 划分训练集与测试集
input=res(temp(1:length(res),1:x)'; %输入变量
output=res(temp(1:length(res),x+1)'; %输出变量
L=length(output);
num=round(L*0.7); %划分比例
% 训练集
input_train=input(:,1:num);
output_train=output(:,1:num);
%测试集
input_test=input(:,num+1:end);
output_test=output(:,num+1:end);
%% 归一化
[inputn,inputps]=mapminmax(input_train,0,1);
inputn_test=mapminmax('apply',input_test,inputps);
[outputn,outputps]=mapminmax(output_train);
outputn_test = mapminmax('apply',output_test,outputps);
%% 向量长度
inputnum=size(input_train,1);
outputnum=size(output_train,1);
M = size(input_train, 2);
N = size(input_test, 2);
hiddennum=11;
%% 构建模型
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');
%% 模型参数
net.trainParam.epochs=1000;%最大迭代次数
net.trainParam.lr=-0.001;%学习率
net.trainParam.goal=10e-3;%损失函数误差
net.trainParam.max_fail=6; %最大失败次数
%% 模型训练
net1 = train(net,inputn,outputn);
%% 模型测试
an=sim(net1,inputn_test);
% 反归一化
test_sim=mapminmax('reverse',an,outputps);
%% 精度指标
% R2
R2 = 1 - norm(output_test - test_sim)^2 / norm(output_test - mean(output_test))^2;
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
MAE= sum(abs(output_test - test_sim )) ./ N ;
disp(['测试集数据的MAE为:', num2str(MAE)])
% MSE
MSE=sum((output_test - test_sim).^2) ./ N ;
disp(['测试集数据的MSE为:', num2str(MSE)])
% RMSE
RMSE = sqrt(sum((output_test - test_sim ).^2) ./ N);
disp(['测试集数据的RMSE为:', num2str(RMSE)])
% MAPE
MAPE=mean(abs(output_test - test_sim)./output_test) ;
disp(['测试集数据的MAPE为:', num2str(MAPE)])
%% 可视化
figure
plot(output_test,'bo-','linewidth',1.2)
hold on
plot(test_sim,'r*-','linewidth',1.2)
legend('真实值','预测值')
xlabel('测试集样本编号')
ylabel('强度/MPA')
xlim([1,N])
title('BP神经网络测试集真实值和预测值的对比')
分类模型代码展示及注释讲解
%% 分类模型
%% 清空环境变量
warning all
clear all
close all
clc
%% 导入数据
res = xlsread('excel表格');%如果一个excel存在多个表格可后缀加(‘sheet’,'读取数据Ax:xx')
%% 随机变量
temp = randperm(length(res));%增强数据之间独立性
% 划分训练集和测试集
input=res(temp(1:length(res)),1:x)';%输入数据
output=res(temp(1:length(res)),x+1)';%输出数据
L=length(output);
num=round(L*0.7);
% 训练集
input_train=input(:,1:num);
output_train=output(:,1:num);
% 测试集
input_test=input(:,num+1:end);
output_test=output(:,num+1:end);
%% 归一化
[inputn,inputps]=mapminmax(input_train,0,1);
inputn_test=mapminmax('apply',input_test,inputps);
% 输出数据归一化
outputn = ind2vec(output_train); %二分类问题将分类1索引为[1,0]向量,分类2索引为[0,1]向量
,故分类问题输出为俩个
outputn_test = ind2vec(output_test);
%% 向量长度
inputnum=size(input_train,1);
outputnum=size(output_train,1);
M = size(input_train, 2);
N = size(input_test, 2);
hiddennum=8;
%% 建立模型
net = newff(inputn, outputn, hiddennum);
%% 模型参数
net.trainParam.epochs=1000;%最大迭代次数
net.trainParam.lr=-0.001;%学习率
net.trainParam.goal=10e-3; % 损失函数目标值
net.trainParam.max_fail=6; %最大失败次数
%% 模型训练
net = train(net,inputn,outputn);
%% 模型测试
an=sim(net,inputn_test);
%% 反归一化
test_sim=vec2ind(an);
%% 数据排序,为了可视化更加直观
[output_test, index] = sort(output_test);
test_sim = test_sim(index);
%% 精度指标
error =sum(output_test==test_sim)/N*100; % ’==‘左右相等输出1,不等输出0
%% 绘图
figure
plot(1: N, output_test, 'r-*', 1: N, test_sim, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['准确率=' num2str(error) '%']};
title(string)
xlim([1, N])
grid
%% 混淆矩阵
figure
cm = confusionchart(output_test, test_sim);
cm.Title = 'Confusion Matrix for Test Data';
cm.ColumnSummary = 'column-normalized';
cm.RowSummary = 'row-normalized';
%% ROC曲线
[x, y, ~, AUC] = perfcurve(output_test, test_sim,2);
figure
plot(x ,y,'r-*', 'LineWidth', 1.5)
hold on
xlabel('假阳性率')
ylabel('真阳性率')
title('ROC曲线')
string = {['AUC=' num2str(AUC)]};
legend(string,'FontSize',12)
4 视频讲解
B站搜索:' 不想学习的陈成 '