我应该使用Matlab中的哪个函数来验证模型预测()或预测()?

时间:2017-10-24 14:56:12

标签: matlab

我使用了两种类型的模型来为具有时间序列数据的SISO系统建模。第一个是ARIMAx,第二个是输出错误。现在,我应该知道两者中哪一个在预测输出时表现最佳,在我的情况下为15天,并且只有必要的观察输出正确初始化。在Matlab中,它提供了两个函数,似乎用于验证forecast()predict()的模型。我一直在阅读预测和预测之间的区别,显然人们误解了这两个术语。我想知道我应该使用哪两个来验证模型并选择最好的模型。重点是我必须测试模型在很多视野中的表现。换句话说,模型如何执行预测的第一天,即提前的第二天直到提前15天。我编写了以下代码作为示例:

close all
clear all
tic;
uhe = {'furnas'};

% Set the structures to be evaluated in ARMAx model
na = 10;
nb = 2;
nc = 1;
nk = 2;

% Set the structures to be evaluated in OE model
nbb = 10;
nf = 6;
nkk = 0;

u = 1;

% Read  training dataset file and set iddata definitions
data_train = importdata(strcat('train_',uhe{u},'.dat'));
data_test = importdata(strcat('test_',uhe{u},'.txt'));
data_valid = importdata(strcat('valid_',uhe{u},'.txt'));
data_complet = vertcat(data_train, data_valid, data_test);

data_complet = iddata(data_complet(:,2),data_complet(:,1));
data_complet.TimeUnit = 'days';
data_complet.InputName = 'Chuva';
data_complet.OutputName = 'Vazão';
data_complet.InputUnit = 'm³/s';
data_complet.OutputUnit = 'm³/s';
data_complet.Name = 'Sistema Chuva-Vazão';

data_train = iddata(data_train(:,2),data_train(:,1));
data_train.TimeUnit = 'days';
data_train.InputName = 'Chuva';
data_train.OutputName = 'Vazão';
data_train.InputUnit = 'm³/s';
data_train.OutputUnit = 'm³/s';
data_train.Name = 'Sistema Chuva-Vazão';

data_valid = iddata(data_valid(:,2),data_valid(:,1));
data_valid.TimeUnit = 'days';
data_valid.InputName = 'Chuva';
data_valid.OutputName = 'Vazão';
data_valid.InputUnit = 'm³/s';
data_valid.OutputUnit = 'm³/s';
data_valid.Name = 'Sistema Chuva-Vazão';

data_test = iddata(data_test(:,2),data_test(:,1));
data_test.TimeUnit = 'days';
data_test.InputName = 'Chuva';
data_test.OutputName = 'Vazão';
data_test.InputUnit = 'm³/s';
data_test.OutputUnit = 'm³/s';
data_test.Name = 'Sistema Chuva-Vazão';

% Modeling training dataset with ARMAx
models_train_armax = armax(data_train,[na nb nc nk]);

% Modeling training dataset with OE
models_train_oe = oe(data_train,[nbb nf nkk]);

% Evalutaing the validation dataset ARMAX
x0 = findstates(models_train_armax,data_valid);
OPT = simOptions('InitialCondition',x0); 
ssmodel_armax=idss(models_train_armax); 
models_valid_armax = sim(ssmodel_armax,data_valid,OPT);

% Evaluating the validation dataset OE
x0 = findstates(models_train_oe,data_valid);
OPT = simOptions('InitialCondition',x0); 
ssmodel_oe=idss(models_train_oe); 
models_valid_oe = sim(ssmodel_oe,data_valid,OPT);

% Predicting Horizon
hz = 20;

% Applying predict function
opt = predictOptions('InitialCondition','e');
[y_armax_pred] = predict(ssmodel_armax,data_valid(1:end),hz,opt);
[y_oe_pred] = predict(ssmodel_oe,data_valid(1:end),hz,opt);

% Applying forecast function
opt = forecastOptions('InitialCondition','e');
[y_armax_fc] = forecast(ssmodel_armax,data_train((end-max([na nb nc nk])):end),hz,data_test.u(1:hz),opt);
[y_oe_fc] = forecast(ssmodel_oe,data_train((end-max([nbb nf nkk])):end),hz,data_test(1:hz),opt);

1 个答案:

答案 0 :(得分:1)

取决于您如何尝试验证模型。通常,您可以使用predict命令,因为您希望对以前的数据进行回溯测试。

或者你可以使用forecast如果你有一个交叉验证/保留样本而你想要对此进行测试

Matlab的help有一个关于预测与预测之间差异的有趣线条

  

预测在超出测量数据最后一刻的时间范围内对未来进行预测。相反,预测命令预测所识别的模型对测量数据的时间跨度的响应。使用预测来确定预测结果是否与估计模型的观察响应相匹配。如果sys是一个很好的预测模型,请考虑将其与预测一起使用。

另请注意,Matlab的help for predict也表示仔细模型验证不应使用预测范围的默认值。

  

对于仔细的模型验证,一步提前预测(K = 1)通常不是在测量数据的时间跨度内验证模型系统的良好测试。即使是微不足道的一步预测器,y(hat)(t)= y(t-1),也可以给出良好的预测。因此,对于采样时间较短的数据的一步预测,较差的模型可能看起来很好。使用K = Inf进行预测(与使用sim命令执行仿真相同)可能导致输出偏差,因为数据中的低频干扰得到强调,尤其是对于具有积分的模型。使用介于1和Inf之间的K值来捕获测量数据的中频行为。