clc
clear
close all
%本程序可以预测地质沉降数据的多种数据,但是每次预测两种
a = input('请输入数据行数1: ');%需要预测第一种数据行数
b = input('请输入数据行数2: ');%需要预测第二种数据行数
num1 = xlsread('a.xlsx');%读取数据
num2 = num1(2:11,:);%提取有效数据
%建立时间序列数据模型
for ii = 1:10
num(ii,1:6)= num2(a,ii:ii+5);
num(ii,13) = num2(a,ii+6);
num(ii,7:12)= num2(b,ii:ii+5);
num(ii,14) = num2(b,ii+6);
end
input_train=num(1:10,1:12)';%训练数据输入数据
output_train=num(1:10,13:14)';%训练数据输出数据
input_test=num((9:10),1:12)';%测试数据输入数据
output_test=num(9:10,13:14)'; %测试数据输出数据
%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
%% BP网络训练
% %初始化网络结构
%10是中间层神经元个数,可以调整,2是输出层神经元个数,和输出数据的维数相对应,不可调整
%logsig输入层到中间层传递函数
%tansig输入层到中间层传递函数
%tansig自适应学习率动量因子梯度下降训练函数
net=newff(minmax(inputn),[10,2],{'logsig','tansig'},'traingdx');
net.trainParam.epochs=5000;%最大迭代次数
net.trainParam.lr=0.0001;%学习率
net.trainParam.goal=0.00004;%学习目标
%网络训练
net=train(net,inputn,outputn);
%% BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%网络预测输出
an=sim(net,inputn_test);
%网络输出反归一化
BPoutput=(mapminmax('reverse',an,outputps));
jie = abs((output_test-BPoutput)./BPoutput);
%% 结果分析
figure(1)
plot(BPoutput(1,:)',':og')%预测输出1做图,绿色虚线,圆圈
hold on
plot(BPoutput(2,:)',':dr')%预测输出2做图,红色虚线,菱形
hold on
plot(output_test(1,:)','-b*');%实际数据做图,蓝色实线,*形
hold on
plot(output_test(2,:)','--r<');%实际数据做图,红色虚线,三角形
legend('预测输出1','预测输出2','期望输出1','期望输出2')%标签
title('BP预测','fontsize',12)%标题
ylabel('函数输出','fontsize',12)%纵轴
xlabel('样本','fontsize',12)%X轴
%预测误差
error=BPoutput-output_test;