2017-10-24 7 views
0

私は時系列データを持つSISOシステムをモデル化するために2種類のモデルを使用しました。最初はARIMAxで、もう1つは出力エラーです。今、私は、2つのうちのどれが、特定の水平線、私の場合は15日で入力を与える出力を予測するのに最適で、モデルの必要な観測出力だけが適切に初期化されるかを知るべきです。 Matlabには、forecast()predict()のモデルを検証するために使用されるような2つの関数があります。私は予測と予測の違いを読んでいて、明らかに人々は2つの言葉を誤って誤解しています。モデルを検証し、最良のモデルを選択するために使用する2つのモデルを知りたいと思います。要点は、モデルのパフォーマンスを多くの視野でテストする必要があることです。言い換えれば、第1日目の予測を第2日目に予測し、第15日目を予測する方法です。私は例として次のコードを書いた:Matlabのどの機能を使用して、モデルのForecast()またはpredict()を検証する必要がありますか?

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

モデルの検証方法によって異なります。通常、以前のデータに対してバックテストを実行する場合は、predictコマンドを使用します。

あなたはクロスバリデーション/ホールドアウトサンプルを持っていて、その

MATLABのhelpが予想との差異に関する興味深いラインを持っており、

を予測に対してテストしたい場合はまた、あなたがforecastを使用することができます予測は、測定されたデータの最後の瞬間を越えた時間範囲で将来の予測を実行します。対照的に、予測コマンドは、測定されたデータの時間スパンにわたって識別されたモデルの応答を予測する。 predictを使用して、予測結果が推定モデルの観測された応答と一致するかどうかを判断します。 sysが良い予測モデルである場合、予測と一緒に使用することを検討してください。

また、Matlabのhelp for predictは、慎重なモデル検証では、予測地平線のデフォルト値を使用すべきではないことにも注意してください。

モデル検証を慎重に行うためには、測定データの期間にわたってモデルsysを検証するための1ステップ先行予測(K = 1)は、通常、良いテストではありません。たとえ些細な1歩先行予測因子y(hat)(t)= y(t-1)であっても、良好な予測を与えることができる。そのため、貧弱なモデルでは、サンプル時間の短いデータの1ステップ先行予測を正しく行うことができます。 simコマンドでシミュレーションを実行するのと同じK = Infでの予測は、特に統合されたモデルの場合、データの低周波外乱が強調されるため、発散出力につながる可能性があります。測定データの中間周波数動作を取得するには、1〜Infの間のK値を使用します。

関連する問題