直接复制就能用的BP神经网络代码

warning off

close all

clear

clc % 清空命令行

 

%% 导入数据

res = xlsread('插补后数据预测.xlsx');

 

%% 数据分析

num_size = 0.8;

outdim = 1; % 最后一列为输出

num = nsize(res, 1); % 样本个数

train_s = round(num_size * num); % 训练集样本个数

f_ = nsize(res, 2) - outdim; % 输入特征维度

 

%% 划分训练集和测试集

Prain = res(1: train_s, 1: f_)';

Train = res(1: train_s, f_ + 1: end)';

M = nsize(Prain, 2);

 

Ptest = res(train_s + 1: end, 1: f_)';

Ttest = res(train_s + 1: end, f_ + 1: end)';

N = nsize(Ptest, 2);

 

%% 数据归一化

[p_train, ps_input] = mapminmax(Prain, 0, 1);

p_test = mapminmax('apply', Ptest, ps_input);

 

[t_train, ps_output] = mapminmax(Train, 0, 1);

t_test = mapminmax('apply', Ttest, ps_output);

 

%% 创建网络

net = newff(p_train, t_train, 5);

 

%% 设置训练参数

net.trainParam.epochs = 1500; % 迭代次数

net.trainParam.goal = 1e-6; % 误差阈值

net.trainParam.lr = 0.01; % 学习率

 

%% 训练网络

net= train(net, p_train, t_train);

 

%% 仿真测试

t_im1 = sim(net, p_train);

t_im2 = sim(net, p_test);

 

%% 数据反归一化

T_im1 = mapminmax('reverse', t_im1, ps_output);

T_im2 = mapminmax('reverse', t_im2, ps_output);

 

%% 均方根误差

error1 = sqrt(sum((T_im1 - Train).^2) ./ M);

error2 = sqrt(sum((T_im2 - Ttest ).^2) ./ N);

 

%% 绘图

figure

plot(1: M, Train, 'r-*', 1: M, T_im1, 'b-o', 'LineWidth', 1)

legend('真实值', '预测值')

xlabel('预测样本')

ylabel('预测结果')

string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};

title(string)

xlim([1, M])

grid

 

figure

plot(1: N, Ttest, 'r-*', 1: N, T_im2, 'b-o', 'LineWidth', 1)

legend('真实值', '预测值')

xlabel('预测样本')

ylabel('预测结果')

string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};

title(string)

xlim([1, N])

grid

 

%% 相关指标计算

% R2

R1 = 1 - norm(Train - T_im1)^2 / norm(Train - mean(Train))^2;

R2 = 1 - norm(Ttest - T_im2)^2 / norm(Ttest - mean(Ttest ))^2;

disp(['训练集数据的R2为:', num2str(R1)])

disp(['测试集数据的R2为:', num2str(R2)])

 

% MAE

mae1 = sum(abs(T_im1 - Train)) ./ M ;

mae2 = sum(abs(T_im2 - Ttest )) ./ N ;

 

disp(['训练集数据的MAE为:', num2str(mae1)])

disp(['测试集数据的MAE为:', num2str(mae2)])

 

% MBE

mbe1 = sum(T_im1 - Train) ./ M ;

mbe2 = sum(T_im2 - Ttest ) ./ N ;

 

disp(['训练集数据的MBE为:', num2str(mbe1)])

disp(['测试集数据的MBE为:', num2str(mbe2)])

%MAPE

MAPE1 = mean(abs((Train - T_im1)./Train));

MAPE2 = mean(abs((Ttest - T_im2)./Ttest));

 

disp(['训练集数据的MAPE为:', num2str(MAPE1)])

disp(['测试集数据的MAPE为:', num2str(MAPE2)])

%% 绘制散点图

sz = 25;

c = 'b';

 

figure

scatter(Train, T_im1, sz, c)

hold on

plot(xlim, ylim, '--k')

xlabel('训练集真实值');

ylabel('训练集预测值');

xlim([min(Train) max(Train)])

ylim([min(T_im1) max(T_im1)])

title('训练集预测值 vs. 训练集真实值')

 

figure

scatter(Ttest, T_im2, sz, c)

hold on

plot(xlim, ylim, '--k')

xlabel('测试集真实值');

ylabel('测试集预测值');

xlim([min(Ttest) max(Ttest)])

ylim([min(T_im2) max(T_im2)])

title('测试集预测值 vs. 测试集真实值')

%% 保存所需变量

save net.mat net

save ps_input.mat ps_input

save ps_output.mat ps_output

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值