LSTMを使わない時系列予測について

9 ビュー (過去 30 日間)
Naoto Iwaki
Naoto Iwaki 2019 年 11 月 11 日
コメント済み: Naoto Iwaki 2019 年 11 月 12 日
LSTM以外で時系列(sequence-to-sequence)予測を行ってみたいと思っています。
最終的には
pressure_data_20190326_1.xlsx上のサイクル番号1~271の時系列データ(B5~JL1444)を
サポートベクター回帰を用いて学習させ残りのサイクル番号272~300(JM5~KO1444)まで
の各サイクルにおける時系列データを予測し、LSTMで行った場合と比較検討しようと考えています。
まず前半のサポートベクター回帰に学習のところまでコードを書いて実行したところ
svmMdl=fitrsvm(tbl.Var1,tbl.Var2);
の行で「XとYの観測数が同じではない」などのエラーが出ます。
そこでどこをどう修正したほうがよいのか、またはこの条件では不可能なのかを教えていただきたいです。
%ファイルの読み込み 行列の縦がその周期内での時系列変化で横が各周期をあらわす
opts = detectImportOptions('pressure_data_Kusaka_Lab_20190326_1.xlsx','DataRange','B5');
T1=readtable('pressure_data_Kusaka_Lab_20190326_1.xlsx',opts,'ReadVariableNames',false);
T1_data = T1.Variables;
%1行N列の配列へ
for i=1:300
T1_array{i}=T1_data(1:end,i)'; %縦の数値を一塊とした新たな配列へ
end
%転置
T1_a=(T1_array)';
%シーケンスの最初の90%で学習を行い残りの10%でテストする
numTimeStepsTrain = floor(0.9*numel(T1_a));
T1Train = T1_a(1:numTimeStepsTrain+1);
T1Test = T1_a(numTimeStepsTrain+1:end);
XT1Train=T1Train(1:end-1); %入力 エクセルファイル上ではB5~JK1444までの数値相当
YT1Train=T1Train(2:end); %応答 エクセルファイル上ではC5~JL1444までの数値相当
tbl=cell2table([XT1Train YT1Train]); %fitrsvmを通すためにcell型からtable型へ
svmMdl=fitrsvm(tbl.Var1,tbl.Var2);
  1 件のコメント
Naoto Iwaki
Naoto Iwaki 2019 年 11 月 11 日
確かに間違えていました。
とりあえず両方をベクトルに修正することにします。
修正中に2点疑問が生まれました。
①以下のように修正した場合SVR内部での学習手順が
XTrain(1,1)→YTrain(1,1)   (1行目同士)
XTrain(2,1)→YTrain(2,1)    (2行目同士)
XTrain(3,1)→YTrain(3,1)   (3行目同士)
のように逐次的になるのですか。それとも
XTrain( : ,1)→YTrain( : ,1)
のように全体的な処理手順を経ているのですか。
②もし①での処理が前者の逐次的であるならば最終的にはできれば
XTrain(1:1440,1)→YTrain(1:1440,1)
XTrain(1441:2880,1)→YTrain(1441:2880,1)
の手順で内部で学習が進むようにしたいのですが可能でしょうか。
%ファイルの読み込み 行列の縦がその周期内での時系列変化で横が各周期をあらわす
opts = detectImportOptions('pressure_data_Kusaka_Lab_20190326_1.xlsx','DataRange','B5');
T1=readtable('pressure_data_Kusaka_Lab_20190326_1.xlsx',opts,'ReadVariableNames',false);
T1_data = T1.Variables;
[row,~]=size(T1);
%1行N列の配列へ
for i=1:300
T1_array{i}=T1_data(1:end,i)'; %縦の数値を一塊とした新たな配列へ
end
%シーケンスの最初の90%で学習を行い残りの10%でテストする
numTimeStepsTrain = floor(0.9*numel(T1_array));
T1Train=T1_data(1:end,1:numTimeStepsTrain+1);
T1Test=T1_data(1:end,numTimeStepsTrain+1:end);
XT1Train=T1Train(:,1:end-1); %入力 エクセルファイル上ではB5~JK1444までの数値相当
YT1Train=T1Train(:,2:end); %応答 エクセルファイル上ではC5~JL1444までの数値相当
XTrain=[XT1Train(:)];
YTrain=[YT1Train(:)];
svmMdl=fitrsvm(XTrain,YTrain);

サインインしてコメントする。

採用された回答

Hiro Yoshino
Hiro Yoshino 2019 年 11 月 12 日
(1)のようになります。一次元入力に対して、一次元出力が得られます。
(2)のようにやりたいのであれば、for文でやられては?
ご理解されているとは思いますが、(2)のようにやっても時系列解析出来ません。
というのも、それぞれの入力に対して出力が有り、学習ではそれら全体がそれっぽく出力に合うようになるだけです。
時系列解析ではデータ間の関係も通常はモデリングします。SVMでは出来ていません。
これは入力データが前後に相関のある連続量であるとモデリングされている訳では無いからです。
もしLSTM以外の時系列モデリングをお考えでしたら
あたりをご参考にされると良いかなと思います。
  1 件のコメント
Naoto Iwaki
Naoto Iwaki 2019 年 11 月 12 日
URLも含めて回答ありがとうございます。助かりました。

サインインしてコメントする。

その他の回答 (1 件)

Hiro Yoshino
Hiro Yoshino 2019 年 11 月 11 日
こちらご覧ください
fitrsvm(X,Y)
Yはn行1列のベクトルである必要があります。

カテゴリ

Help Center および File Exchangeサポート ベクター マシン回帰 についてさらに検索

製品


リリース

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!