模型输入层节点数为输入特征数,输出层节点数为想要得到结果的个数。
在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。
RBF神将网络是一种三层神经网络,其包括输入层、隐层、输出层。从输入空间到隐层空间的变换是非线性的,而从隐层空间到输出层空间变换是线性的。
注意x最后有个转置,变为行向量
% 清空环境变量
clear all
clc
% 输入数据,注意有个转置'
x=[54167
55196
56300
57482
58796
60266
61465
62828
64653
65994
67207
66207
65859
67295
69172
70499
72538
74542
76368
78534
80671
82992
85229
87177
89211
90859
92420
93717
94974
96259
97542
98705
100072
101654
103008
104357
105851
107507
109300
111026
112704
114333
115823
117171
118517
119850
121121
122389
123626
124761
125786
126743
127627
128453
129227
129988
130756
131448
132129
132802
134480
135030
135770
136460
137510]';
自回归阶数:认为与前三年密切相关
input:训练网络的输入数据,shape为3行n-3列,表示这一年的人口只与前三年有关
inputs(:,i)=iinput(i:i+lag-1)’:第i+1年的人口由i~i+lag-1,这lag年的人口决定
targets=x(lag+1:end):预测的目标结果
% 该脚本用来做神经网络预测
lag=3; % 自回归阶数
iinput=x; % x为原始序列(行向量)
n=length(iinput);
% 准备输入和输出数据
inputs=zeros(lag,n-lag);
for i=1:n-lag
inputs(:,i)=iinput(i:i+lag-1)';
end
targets=x(lag+1:end);
fitnet函数在Matlab中的使用方法
% 创建网络
hiddenLayerSize = 10; %隐藏层神经元个数
net = fitnet(hiddenLayerSize);
% 避免过拟合,划分训练,测试和验证数据的比例
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
%训练网络
[net,tr] = train(net,inputs,targets);
画图显示训练效果
%% 根据图表判断拟合好坏
yn=net(inputs);
errors=targets-yn;
figure, ploterrcorr(errors) %绘制误差的自相关情况(20lags)
figure, parcorr(errors) %绘制偏相关情况
% [h,pValue,stat,cValue]= lbqtest(errors) %Ljung-Box Q检验(20lags)
figure,plotresponse(con2seq(targets),con2seq(yn)) %看预测的趋势与原趋势
figure, ploterrhist(errors) %误差直方图
figure, plotperform(tr) %误差下降线
自相关性图中除了0阶自相关外,其他的自相关系数系数都不应该超过上下置信区间。
预测未来7年的人口
注意f_in的更新方法,将预测得到的数据做为历史数据再进行预测
f(1) = net([iinput(n-2), iinput(n-1), iinput(n)])
f(2) = net([iinput(n-1), iinput(n), f(1)]
f(3) = net([ iinput(n), f(1), f(2)]
f(4) = net([f(1), f(2), f(3)]
…
%% 下面预测往后预测几个时间段
fn=7; %预测步数为fn
f_in=iinput(n-lag+1:end)'; %取最后lag个数
f_out=zeros(1,fn); %预测输出
% 多步预测时,用下面的循环将网络输出重新输入
for i=1:fn
f_out(i)=net(f_in); %预测第i年的人口
f_in=[f_in(2:end);f_out(i)]; % 将预测出的第i年人口当作历史数据输入
end
% 画出预测图
figure,plot(1949:2013,iinput,'b',2013:2020,[iinput(end),f_out],'r')
数据集中包含采集到的60组汽油样品,利用傅立叶近红外变换光谱仪对其进行扫描,扫描间隔为2nm的近红外光谱曲线如图所示,其中包含对曲线的局部放大图。同时数,每个样品的光谱曲线包含401个波长点,样品据集中包含使用传统的检测方法测定的辛烷含量值。
%% I. 清空环境变量
clear all
clc
%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat
%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);
%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
[t_train, ps_output] = mapminmax(T_train,0,1);
%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);
%%
% 2. 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
%%
% 3. 训练网络
net = train(net,p_train,t_train);
%%
% 4. 仿真测试
t_sim = sim(net,p_test);
%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
决定系数越接近1越好
%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2));
%%
% 3. 结果对比
result = [T_test' T_sim' error']
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};
title(string)
net = newrbe(P_train, T_train, 30);