我使用Keras来构建LSTM recurrent neural network。我的代码运行良好,但可以通过严重的重构来完成。我预测的是时间序列值,根据我想预测的窗口大小,我最终编写的代码似乎与窗口大小有很大的关系,即很难满足大量不同的大小。由于动态变量在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)
如果我想预测未来5时步,然后我的预测,存储在变量trainY
,将采取形式[[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]
现在,如果我要得到这些值早在一个逻辑顺序,即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)
我的问题出现时,我想向外伸出预测窗口说10个时间步。然后,我手动扩展前面的代码,如下所示
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(输出)'总是等于'predict_steps'?如果'i'不是'0'以外的任何东西,你的循环中的第一行是不是会引发'IndexError'? –
根据数据集的不同,任何输出都不是真的。它可能会从't + 6,...,t + 500'出现,但输出的是在窗口中预测的,其长度等于'predict_steps'。那有意义吗?或者我会用一个我的意思是什么来更新这个问题? –
但是'output'仍然是一个二维列表形式的正方形对称矩阵,对吗?你能举一个例子,比如说'predict_steps'是'3','len(output)'是'5'吗? “输出”是什么样的,你的循环是什么样的呢? –