编辑: 这个答案很有帮助,但是,我真的很想要一些实际的张量流javascript代码来展示如何实现此功能。 How to train a RNN with LSTM cells for time series prediction
我发现的其他问题未涵盖归一化或我对未来超过1点的预测的特定目标,要牢记局部性,即如果在T + 1预测1,则T + 2更有可能是0。
数据样本总数(实际上有132个样本)
const Data = [
[0,45,0,0],
[1,40,0,0],
[0,10,3,0],
[0,0,0,0],
[2,30,0,1],
[2,20,3,1]
];
数组表示形式[X1,X2,X3,Y]
*注意X2需要归一化---如果我们需要在单个网络中进行所有这些预测时将X2预测为未来值以便预测Y,则不确定如何处理
最终目标
使用这些数据(包含更多的样本),以最准确的方式预测接下来的5个Y值,同时权衡先前的模式,就像在时间序列预测中一样,过去的样本可能会从那时起成为25个重要样本。
当前进度
通过在25个[X1,X2,X3]数组上进行训练而向前预测了25个值,只是发现输入位置1([X1,X2,X3]数组1)会影响所有接下来的25个Y值,但会影响位置2( [X1,X2,X3]数组2)仅会影响集合的2-25,依此类推,以此类推---位置25仅会影响25个预测值的最后一个值---所以我可能没有就网络而言,甚至可以真正预测下25个。
当前方法
期望的预测将是(例如)训练后的下三个Y值
输入:
[
[0,45,0],
[1,40,0],
[0,10,3]
]
输出
[
[0],
[1],
[1]
]
到目前为止尝试过的模型
var model = tf.sequential();
model.add(tf.layers.batchNormalization({
inputShape:[null,6],
axis: 2,
units:10,
//returnSequences: true,
//kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.lstm({
//inputShape:[null,7],
units: 10,
activation: 'relu',
returnSequences: true,
//kernelInitializer: 'VarianceScaling'
}));
model.add(tf.layers.lstm({
//inputShape:[null,7],
units: 6,
activation: 'relu',
returnSequences: true,
//kernelInitializer: 'VarianceScaling'
}));
//modelHelper(model);
const optimizer = tf.train.adam (.05);
//optimizer: 'sgd', loss: 'binaryCrossentropy', lr: 0.1
model.compile({
loss:tf.losses.meanSquaredError,
optimizer:optimizer
});
在每个时间位置(X1,X2,X3)使用多个值时,预测时间序列的下一个4或5或25个单个(Y)值而不是仅预测下一个值的最佳方法是什么?
*浏览5年后创建了一个帐户,因此失去了这个帐户。
答案 0 :(得分:0)
这里有很多问题。
预测时间序列的下一个4、5或25个单一(Y)值而不是仅预测下一个值的最佳方法是什么
您只需要返回lstm的序列。如果要预测接下来的4个值,则最后一个lstm层的units
应该为4,并将返回值returnSequences
设置为true。
如果您要根据序列预测1或0,则可以对最后一层使用binaryCrossEntropy
损失和softmax
激活来计算概率。至于最有可能的情况,如果数据与您的观察结果非常一致,则网络会找出来,即如果在T中预测为1,那么在T + i处可能预测为0。
X2需要归一化---如果我们需要在一个网络中将所有X2预测为将来值以便预测Y以便预测Y,则不确定如何处理
这并非特定于您的用例,最佳做法是将所有数据保持在同一范围内。对于具有高方差的数据,往往会在很大程度上影响影响收敛的模型。您可以在输入模型之前标准化x2功能。这是一个将所有功能的数据标准化的功能
// standardize a tensor data by computing (data - mean(data) ) / std(data)
function standardize(data) {
let means = []
let variances = []
for ( let axe = 0 ; axe < axes; axe++) {
const {mean, variance} = tf.moments(data.gather([axe], 1), undefined, true )
means.push(mean)
variances.push(variances)
}
return data.sub(tf.concat(means).reshape([axes])).div(tf.concat(variances).reshape([axes]))
}