Narx-сети (Nonlinear AutoRegressive networks with eXogenous inputs) представляют собой специализированный тип рекуррентных нейронных сетей, применяемых для моделирования динамических систем и прогнозирования временных рядов. Ключевая особенность Narx-сети — зависимость текущего состояния сети не только от внешних входов, но и от предыдущих значений как входов, так и выходов. Это позволяет эффективно учитывать временные зависимости в данных.
Narx-сеть включает три основные компоненты:
Layer, соединённый
с входным и выходным слоями через Connection.Лаговые входы реализуются с помощью буферов, которые
сохраняют предыдущие значения сигналов. Если заданы n
лагов, сеть получает в качестве входа массив
[x(t), x(t-1), ..., x(t-n)] для внешних сигналов и
[y(t-1), ..., y(t-n)] для выходов.
Synaptic.js предоставляет базовые элементы для построения нейронных
сетей: Layer, Network, Trainer.
Для создания Narx-сети необходимо вручную организовать обработку лаговых
входов.
Пример структуры сети с лагами:
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
// Создание слоев
const inputLayer = new Layer(6); // допустим, 3 входа + 3 лаговых значения
const hiddenLayer = new Layer(10);
const outputLayer = new Layer(1);
// Соединение слоев
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
// Формирование сети
const narxNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
В этом примере 3 исходных входа дополняются 3 лаговыми значениями, формируя полный входной вектор размером 6.
Для обучения сети необходимо преобразовать временной ряд в обучающие примеры с учетом лагов.
Алгоритм формирования обучающих примеров:
Определить количество лагов nLag.
Для каждого временного шага t формировать вектор
входов:
inputs = [x(t), x(t-1), ..., x(t-nLag), y(t-1), ..., y(t-nLag)]
target = y(t)Создать массив объектов
{ input: inputs, output: [target] } для тренера.
Пример на Jav * aScript:
function createLaggedData(xSeries, ySeries, nLag) {
const data = [];
for (let t = nLag; t < xSeries.length; t++) {
const input = [];
for (let i = 0; i < nLag; i++) {
input.push(xSeries[t - i - 1]);
input.push(ySeries[t - i - 1]);
}
input.push(xSeries[t]);
data.push({ input: input, output: [ySeries[t]] });
}
return data;
}
Synaptic.js использует класс Trainer для обучения сетей
методом обратного распространения ошибки (backpropagation). Для
Narx-сети важно корректно задавать параметры обучения:
Пример обучения:
const trainer = new Trainer(narxNetwork);
trainer.train(laggedData, {
rate: 0.05,
iterations: 5000,
error: 0.005,
shuffle: true
});
После обучения сеть способна делать прогноз, используя последние лаговые значения. Необходимо поддерживать буфер предыдущих входов и выходов:
function predictNext(network, xLag, yLag, currentX) {
const input = [...xLag, ...yLag, currentX];
const output = network.activate(input);
return output[0];
}
При последовательном прогнозировании необходимо обновлять буфер после каждого предсказания:
yLag.shift();
yLag.push(predictedValue);
Narx-сети, реализованные с использованием Synaptic.js, демонстрируют гибкость и мощность для анализа временных рядов, позволяя создавать кастомизированные модели с учетом специфики данных и требований к точности.