Временные ряды представляют собой последовательности данных, упорядоченные по времени. Для их анализа и прогнозирования в нейронных сетях используется подход скользящего окна (sliding window), который позволяет преобразовать последовательность в набор входных и выходных данных, пригодных для обучения сети.
Суть метода заключается в следующем:
n.n для
входа сети.Пример: Для временного ряда [x1, x2, x3, x4, x5, x6] и
окна размера 3 формируются пары:
| Вход | Выход |
|---|---|
| [x1, x2, x3] | x4 |
| [x2, x3, x4] | x5 |
| [x3, x4, x5] | x6 |
Таким образом, сеть обучается предсказывать следующий элемент на
основе предыдущих n элементов.
Библиотека Synaptic работает с нейронными сетями на уровне нейронов и слоев, без встроенных функций работы с временными рядами. Для обучения необходимо подготовить данные в формате:
const dataset = [
{ input: [x1, x2, x3], output: [x4] },
{ input: [x2, x3, x4], output: [x5] },
{ input: [x3, x4, x5], output: [x6] }
];
Каждый элемент массива — объект с полями input и
output, где input — массив входных значений, а
output — массив целевых значений.
Для работы с временными рядами чаще всего применяются многослойные перцептроны (MLP). Создание сети в Synaptic:
const { Layer, Network, Trainer } = require('synaptic');
const inputLayer = new Layer(3); // размер окна
const hiddenLayer = new Layer(5); // произвольное количество нейронов скрытого слоя
const outputLayer = new Layer(1); // прогноз одного значения
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Выделение ключевых моментов:
Обучение выполняется с помощью Trainer:
const trainer = new Trainer(myNetwork);
trainer.train(dataset, {
rate: 0.01, // скорость обучения
iterations: 20000, // количество итераций
error: 0.005, // допустимая ошибка
shuffle: true, // перемешивание данных
log: 1000 // вывод информации каждые 1000 итераций
});
Особенности при работе с временными рядами:
[0,1] или [-1,1] для
стабильного обучения.shuffle) часто
помогает ускорить сходимость, но может размывать временную
последовательность. Для прогнозирования лучше обучать сеть на
последовательных фрагментах и тестировать на следующих временных
шагах.После обучения можно использовать сеть для пошагового предсказания:
let inputWindow = [x4, x5, x6]; // последние известные значения
let nextValue = myNetwork.activate(inputWindow)[0];
// для многократного прогноза:
inputWindow.push(nextValue);
inputWindow.shift(); // удаление самого старого элемента
Такой метод позволяет прогнозировать несколько шагов вперед, используя каждое новое предсказание как вход для следующего.
Подбор размера окна
Добавление нескольких скрытых слоев
hidden: [layer1, layer2].Регуляризация
Многомерные временные ряды
[x1_1, x1_2, x2_1, x2_2, x3_1, x3_2].Метод скользящего окна с Synaptic эффективен для:
Система обучения на скользящем окне превращает последовательность в классификационную/регрессионную задачу, делая возможным применение стандартного MLP, несмотря на отсутствие встроенной поддержки рекуррентных сетей.