{
const net = new brain.recurrent.LSTMTimeStep(netJson);
net.fromJSON(netJson);
function findBounds(data, key) {
let highest = -Infinity;
let lowest = Infinity;
for (let i = 0; i < data.length; i++) {
const io = data[i][key];
for (let j = 0; j < io.length; j++) {
if (io[j] > highest) {
highest = io[j];
}
if (io[j] < lowest) {
lowest = io[j];
}
}
}
return { highest, lowest };
}
function normalize(data, { highest, lowest }, key) {
return data.map((datum) => {
return {
...datum,
[key]: datum[key].map((value) => (value - lowest) / (highest - lowest)),
};
});
}
function denormalize(data, { highest, lowest }, key) {
if (key) {
return data.map((datum) => {
return {
...datum,
[key]: datum[key].map((value) => (highest - lowest) * (value + lowest)),
};
});
}
return data.map((value) => (highest - lowest) * (value + lowest));
}
const trainingDataRaw = [
{
input: [7, 12, 83, 0, 11, 13, 7],
output: [294],
},
{
input: [7, 76, 1, 4, 18, 5, 3],
output: [343],
},
{
input: [9, 0, 103, 22, 10, 15, 5],
output: [339],
},
{
input: [9, 106, 2, 5, 13, 16, 17],
output: [470],
},
{
input: [8, 17, 92, 13, 3, 37, 10],
output: [403],
},
{
input: [7, 4, 4, 77, 3, 22, 6],
output: [347],
},
{
input: [7, 4, 1, 80, 14, 18, 9],
output: [339],
},
{
input: [6, 0, 12, 58, 11, 7, 12],
output: [258],
},
{
input: [5, 10, 48, 2, 0, 11, 13],
output: [231],
},
{
input: [6, 2, 54, 4, 15, 4, 1],
output: [201],
},
{
input: [5, 9, 2, 41, 15, 0, 7],
output: [204],
},
{
input: [7, 76, 0, 6, 6, 20, 1],
output: [399],
},
];
const inputBounds = findBounds(trainingDataRaw, 'input');
const outputBounds = findBounds(trainingDataRaw, 'input');
let trainingData = normalize(normalize(trainingDataRaw, inputBounds, 'input'), outputBounds, 'output');
console.log(normalize(trainingDataRaw, inputBounds, 'input'));
return normalize(trainingDataRaw, inputBounds, 'input')
.map((datum) => [
...denormalize(datum.input, inputBounds),
...denormalize([net.run(datum.input)], outputBounds),
]);
}