ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
TimeSeriesDatasets.hh
[詳解]
1
10//
11// Copyright (C) 2011-2021 Yokokura, Yuki
12// This program is free software;
13// you can redistribute it and/or modify it under the terms of the FreeBSD License.
14// For details, see the License.txt file.
15
16#ifndef TIMESERIESDATASETS
17#define TIMESERIESDATASETS
18
19#include <cassert>
20#include <array>
21#include <string>
22#include <ctime>
23#include "Matrix.hh"
24#include "Statistics.hh"
25#include "CsvManipulator.hh"
26#include "FrameGraphics.hh"
27#include "CuiPlot.hh"
28
29// ARCS組込み用マクロ
30#ifdef ARCS_IN
31 // ARCSに組み込まれる場合
32 #include "ARCSassert.hh"
33 #include "ARCSeventlog.hh"
34#else
35 // ARCSに組み込まれない場合
36 #define arcs_assert(a) (assert(a))
37 #define PassedLog()
38 #define EventLog(a)
39 #define EventLogVar(a)
40#endif
41
42namespace ARCS { // ARCS名前空間
49template <size_t N, size_t K, size_t T, size_t W, size_t M>
51 public:
52 // 時系列データ
53 std::array<Matrix<M,N>, W + 2> InputData;
55
58 : InputData(), TrainData(),
59 TimeStamp(), InputMat(), TrainMat(), StdInputMat(), StdTrainMat(),
60 xbarIn(), sigmaIn(), xbarTr(), sigmaTr()
61 {
62 PassedLog();
63 }
64
68 TimeSeriesDatasets(const std::string& InputFile, const std::string& TrainFile)
69 : InputData(), TrainData(),
70 TimeStamp(), InputMat(), TrainMat(), StdInputMat(), StdTrainMat(),
71 xbarIn(), sigmaIn(), xbarTr(), sigmaTr()
72 {
73 PassedLog();
74 TimeStamp = tp(Matrix<1,T>::ramp()); // タイムスタンプを生成
75
76 // 時系列入力データの前処理
77 Matrix<N,T> InputDataBuf; // 入力データバッファ
78 CsvManipulator::LoadFile(InputDataBuf, InputFile); // CSVデータを行列として読み込み
79 InputMat = tp(InputDataBuf); // 今後のために転置をしておく
80 StandardizeDataset(InputMat, xbarIn, sigmaIn, StdInputMat); // データセットの標準化
81 VectorizeInputData(StdInputMat, InputData); // 縦ベクトル配列化
82
83 // 時系列訓練データの前処理
84 Matrix<K,T> TrainDataBuf; // 訓練データバッファ
85 CsvManipulator::LoadFile(TrainDataBuf, TrainFile); // CSVデータを行列として読み込み
86 TrainMat = tp(TrainDataBuf); // 今後のために転置をしておく
87 StandardizeDataset(TrainMat, xbarTr, sigmaTr, StdTrainMat); // データセットの標準化
88 VectorizeTrainData(StdTrainMat, TrainData); // 縦ベクトル配列化
89 }
90
94 : TimeStamp(r.TimeStamp), InputMat(r.InputTimeData), TrainMat(r.TrainMat),
95 StdInputMat(r.StdInputMat), StdTrainMat(r.StdTrainMat),
97 xbarIn(r.xbarIn), sigmaIn(r.sigmaIn), xbarTr(r.xbarTr), sigmaTr(r.sigmaTr)
98 {
99
100 }
101
106
110 x = (x - xbarIn) % sigmaIn; // 入力データの標準化値に基づいて入力を標準化
111 }
112
115 void DispInputAndTrainData(const size_t DispNum){
116 printf("\nTime Series Input And Train Data :\n");
117 for(size_t i = 1; i <= W; ++i){
118 //if((i % DispNum) == 0){
119 printf("t = %zu :\n", i);
120 PrintMat(InputData.at(i));
121 //}
122 }
124 printf("Standardization Info :\n");
125 PrintMat(xbarIn);
126 PrintMat(sigmaIn);
127 PrintMat(xbarTr);
128 PrintMat(sigmaTr);
129 }
130
135 void WriteInputPlot(const double Min, const double Max, const std::string& FileName){
136 // グラフ設定
137 FrameGraphics FG(GRAPH_WIDTH, GRAPH_HEIGHT);
138 CuiPlot Plot(FG, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
139 Plot.SetAxisLabels("Time Index", FileName);
140 Plot.SetRanges(0, T, Min, Max);
141 Plot.SetGridLabelFormat("%5.0f", "%3.0f");
142 Plot.DrawAxis();
143
144 // 入力データチャネルごとにプロット
145 for(size_t i = 1; i <= N; ++ i){
146 Plot.DrawLegend(i, "Variable_i", FGcolors::CYAN);
147 Plot.Plot(tp(TimeStamp), tp(getrow(StdInputMat,i)), CuiPlotTypes::PLOT_LINE, FGcolors::CYAN);
148 }
149
150 // PNG画像ファイル出力
151 FG.SavePngImageFile(FileName);
152 }
153
158 void WriteTrainPlot(const double Min, const double Max, const std::string& FileName){
159 // グラフ設定
160 FrameGraphics FG(GRAPH_WIDTH, GRAPH_HEIGHT);
161 CuiPlot Plot(FG, 0, 0, GRAPH_WIDTH, GRAPH_HEIGHT);
162 Plot.SetAxisLabels("Time Index", FileName);
163 Plot.SetRanges(0, T, Min, Max);
164 Plot.SetGridLabelFormat("%5.0f", "%3.0f");
165 Plot.DrawAxis();
166
167 // 入力データチャネルごとにプロット
168 for(size_t i = 1; i <= K; ++ i){
169 Plot.DrawLegend(i, "Variable_i", FGcolors::CYAN);
170 Plot.Plot(tp(TimeStamp), tp(getrow(StdTrainMat,i)), CuiPlotTypes::PLOT_LINE, FGcolors::MAGENTA);
171 }
172
173 // PNG画像ファイル出力
174 FG.SavePngImageFile(FileName);
175 }
176
177 private:
178 TimeSeriesDatasets(const TimeSeriesDatasets&) = delete;
179 const TimeSeriesDatasets& operator=(const TimeSeriesDatasets&) = delete;
180
181 // 時系列データの時間波形グラフの設定
182 static constexpr int GRAPH_WIDTH = 1000;
183 static constexpr int GRAPH_HEIGHT = 500;
184
185 // 内部用時系列データ
186 Matrix<T,1> TimeStamp;
187 Matrix<T,N> InputMat;
188 Matrix<T,K> TrainMat;
189 Matrix<T,N> StdInputMat;
190 Matrix<T,K> StdTrainMat;
191
192 // データセットの各種パラメータ
193 Matrix<1,N> xbarIn;
194 Matrix<1,N> sigmaIn;
195 Matrix<1,N> xbarTr;
196 Matrix<1,N> sigmaTr;
197
202 static void StandardizeDataset(const Matrix<T,N>& RawData, Matrix<1,N>& Mean, Matrix<1,N>& Std, Matrix<T,N>& StdData){
203 Statistics::MeanRow(RawData, Mean); // 行方向の平均の計算
204 Statistics::StandardDeviationRow(RawData, Std); // 行方向の標準偏差の計算
205 Matrix<1,N> buff;
206 for(size_t i = 1; i <= T; ++i){
207 buff = (getcolumn(RawData, i) - Mean) % Std;// データセットを標準化
208 setcolumn(StdData, buff, i);
209 }
210 }
211
215 static void VectorizeInputData(const Matrix<T,N>& MatData, std::array<Matrix<M,N>, W + 2>& VecData){
216 for(size_t i = 1; i <= W; ++i){
217 getvvector(MatData, i, 1, VecData.at(i));
218 }
219 }
220
224 static void VectorizeTrainData(const Matrix<T,K>& MatData, Matrix<M,K>& VecData){
225 getvvector(MatData, W + 1, 1, VecData);
226 }
227
228};
229}
230
231#endif
232
ARCS イベントログクラス
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
CuiPlot(新型きゅいプロットV2)
CSVファイル操作クラス
行列/ベクトル計算クラス(テンプレート版)
#define PrintMat(a)
行列要素表示マクロ(フォーマット指定なし版)
Definition Matrix.hh:36
constexpr void getvvector(const ArcsMat< M, N, T > &U, ArcsMat< P, Q, R > &y, const size_t m, const size_t n)
指定位置から縦ベクトルを抽出する関数 (引数渡し版)
Definition ArcsMatrix.hh:3759
フレームグラフィックスクラスV2(新型テンプレート版)
static void LoadFile(std::array< T, M > &Data, const std::string &FileName)
CSVファイルから1次元std::arrayに読み込む関数
Definition CsvManipulator.hh:72
CuiPlot(新型きゅいプロットV2)
Definition CuiPlot.hh:54
void SetRanges(double xmin, double xmax, double ymin, double ymax)
グラフの範囲を設定する関数
Definition CuiPlot.hh:130
void Plot(const double x, const double y, const CuiPlotTypes type, const uint32_t color)
1点のデータをプロットする関数(バイナリ色データ版)
Definition CuiPlot.hh:250
void SetGridLabelFormat(const std::string &xformat, const std::string &yformat)
グリッドラベルの書式を設定する関数
Definition CuiPlot.hh:153
void SetAxisLabels(const std::string &xlabel, const std::string &ylabel)
軸ラベルを設定する関数
Definition CuiPlot.hh:145
void DrawAxis(void)
グラフの軸を描画する関数
Definition CuiPlot.hh:170
void DrawLegend(size_t i, const std::string &name, const FGcolors &color)
凡例を描画する関数
Definition CuiPlot.hh:188
フレームグラフィックスクラス(新型テンプレート版)
Definition FrameGraphics.hh:91
void SavePngImageFile(const std::string &FileName)
PNG画像ファイルを保存する関数
Definition FrameGraphics.hh:200
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
static void MeanRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の平均を計算して縦ベクトルを出力する関数
Definition Statistics.hh:57
static void StandardDeviationRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の標準偏差を求めて縦ベクトルを出力する関数
Definition Statistics.hh:254
機械学習用 時系列データセットクラス
Definition TimeSeriesDatasets.hh:50
Matrix< M, K > TrainData
ベクトル配列版の標準化済み訓練データ(範囲 t = 1 … W, t = 0 と W + 1 の分も確保)
Definition TimeSeriesDatasets.hh:54
void WriteTrainPlot(const double Min, const double Max, const std::string &FileName)
標準化済み入力データの時間波形をPNGファイルに書き出す関数
Definition TimeSeriesDatasets.hh:158
TimeSeriesDatasets(TimeSeriesDatasets &&r)
ムーブコンストラクタ
Definition TimeSeriesDatasets.hh:93
TimeSeriesDatasets(const std::string &InputFile, const std::string &TrainFile)
コンストラクタ
Definition TimeSeriesDatasets.hh:68
void WriteInputPlot(const double Min, const double Max, const std::string &FileName)
標準化済み入力データの時間波形をPNGファイルに書き出す関数
Definition TimeSeriesDatasets.hh:135
~TimeSeriesDatasets()
デストラクタ
Definition TimeSeriesDatasets.hh:103
void DispInputAndTrainData(const size_t DispNum)
標準化済み入力&訓練データを表示する関数
Definition TimeSeriesDatasets.hh:115
TimeSeriesDatasets(void)
空コンストラクタ
Definition TimeSeriesDatasets.hh:57
void StandardizeInput(Matrix< 1, N > &x)
入力データの標準化
Definition TimeSeriesDatasets.hh:109
std::array< Matrix< M, N >, W+2 > InputData
ベクトル配列版の標準化済み入力データ(範囲 t = 1 … W, t = 0 と W + 1 の分も確保)
Definition TimeSeriesDatasets.hh:53