LSTM recurrent neural networkを作成するのにKerasを使用しています。私のコードはうまくいっていますが、深刻なリファクタリングを行うことができます。私は時系列の値を予測していますが、予測したいウィンドウサイズによっては、そのウィンドウサイズにあまりにも固有のように見えるコードを書くことになります。つまり、さまざまなサイズのものを用意するのは難しいです。動的変数のためにPythonでリストを効率的に作成
私は電車の中に私のデータセットを分割&テストを設定します
print "Dataset length: %d" % len(dataset)
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
print "Train length: %d, Test length: %d" % (len(train), len(test))
両方データセットの長さ:列車の長さ1826:1223、テストの長さ:603
train
のためのその後
とtest
私がする必要が入力であるX
と、出力であるY
を作成します(私が予測しようとしているもの)
def create_dataset(dataset, look_back=1, predict_steps=1):
dataX, dataY = [], []
for i in range(dataset.shape[0] - look_back - predict_steps):
dataX.append(dataset[i:(i + look_back), 0])
dataY.append(dataset[i + look_back:i + look_back + predict_steps, 0])
return np.array(dataX), np.array(dataY)
look_back = 10
predict_steps = 5
input_dim = look_back + 1
trainX, trainY = create_dataset(train, look_back=look_back, predict_steps=predict_steps)
testX, testY = create_dataset(test, look_back=look_back, predict_steps=predict_steps)
print "trainX shape: %s, trainY shape: %s" % (trainX.shape, trainY.shape,)
trainX形状:(1208、10)、trainY形状:(1208、5)
私は、変数trainY
に保存されている5つのその後、先にタイムステップ私の予測を、予測したい場合は、かかりますフォーム[[t+6, t+7, t+8, t+9, t+10], [t+7, t+8, t+9, t+10, t+11]]
、今すなわち
prediction 1 [t+6, t+7, t+8, t+9, t+10]
prediction 2 [t+7, t+8, t+9, t+10, t+11]
prediction 3 [t+8, t+9, t+10, t+11, t+12]
prediction 4 [t+9, t+10, t+11, t+12, t+13]
prediction 5 [t+10, t+11, t+12, t+13, t+14]
私は、これらの値を取得したい場合私は10のタイムステップを言うために、予測窓の外を拡張したい場合に戻って論理的な順序、すなわちt+6, t+7, t+8,...,t+14
に、私はこのコードを
output = trainY
output_plot = np.array([])
output_plot = np.append(output_plot, output[0][0])
output_plot = np.append(output_plot, np.mean([output[0][1], output[1][0]]))
output_plot = np.append(output_plot, np.mean([output[0][2], output[1][1], output[2][0]]))
output_plot = np.append(output_plot, np.mean([output[0][3], output[1][2], output[2][1], output[3][0]]))
for i in range (len(output) - predict_steps + 1):
tmp = np.mean([output[i][4], output[i+1][3], output[i+2][2], output[i+3][1], output[i+4][0]])
output_plot = np.append(output_plot, tmp)
を使用しています私の問題が発生します。次に、私は手動で次のように上記のコードを拡張します。
output = trainY
output_plot = np.array([])
output_plot = np.append(output_plot, output[0][0])
output_plot = np.append(output_plot, np.mean([output[0][1], output[1][0]]))
output_plot = np.append(output_plot, np.mean([output[0][2], output[1][1], output[2][0]]))
output_plot = np.append(output_plot, np.mean([output[0][3], output[1][2], output[2][1], output[3][0]]))
output_plot = np.append(output_plot, np.mean([output[0][4], output[1][3], output[2][2], output[3][1], output[4][0]]))
output_plot = np.append(output_plot, np.mean([output[0][5], output[1][4], output[2][3], output[3][2], output[4][1], output[5][0]]))
output_plot = np.append(output_plot, np.mean([output[0][6], output[1][5], output[2][4], output[3][3], output[4][2], output[5][1], output[6][0]]))
output_plot = np.append(output_plot, np.mean([output[0][7], output[1][6], output[2][5], output[3][4], output[4][3], output[5][2], output[6][1], output[7][0]]))
output_plot = np.append(output_plot, np.mean([output[0][8], output[1][7], output[2][6], output[3][5], output[4][4], output[5][3], output[6][2], output[7][1], output[8][0]]))
for i in range (len(output) - predict_steps + 1):
tmp = np.mean([output[i][9], output[i+1][8], output[i+2][7], output[i+3][6], output[i+4][5], output[i+5][4], output[i+6][3], output[i+7][2], output[i+8][1], output[i+9][0]])
output_plot = np.append(output_plot, tmp)
これは動作しますが、それは恐ろしく非効率です。どのようにしてこれらのステップを最もリファクタリングして、コードをより広い範囲の予測ウィンドウに順応させることができますか?また、私の質問のタイトルはいくらか改善されているので、編集してください!
コードサンプルの最初の部分では、正方形の2Dリストの主対角線の上にある各対角線の平均をとっているようです。しかし、あなたのループが何をしようとしているのか分かりません。 'len(output)'は常に 'predict_steps'と等しくないのですか? 'i'が' 0'以外であれば、ループ内の最初の行は 'IndexError'を送出しませんか? –
データセットに応じて、出力は実際には任意の長さにすることはできません。 't + 6、...、t + 500'から行くかもしれませんが、出力されたものは' predict_steps'に等しい長さのウィンドウで予測されます。それは理にかなっていますか?あるいは、私が意味することの例を使って質問を更新しますか? –
しかし、 'output'は依然として2Dリストの形の正方形の対称行列です、そうですか?たとえば、 'predict_steps'が' '3' '、' 'len(output)' 'が' '5 ''のような例を表示できますか? '出力 'はどのように見えるのですか? –