Библиотека Synaptic — это мощный инструмент для построения, обучения и тестирования нейронных сетей в JavaScript. Она предоставляет низкоуровневый доступ к структурам сети, позволяя создавать как простые перцептроны, так и сложные рекуррентные сети. В основе Synaptic лежат три ключевых компонента: Neuron, Layer и Network.
Narx (Nonlinear AutoRegressive with eXogenous inputs) — это тип рекуррентной сети, ориентированной на предсказание временных рядов. Она использует прошлые значения сигнала (авторегрессия) и внешние входные данные (exogenous inputs) для построения прогноза текущего состояния.
Ключевая особенность Narx-сети: наличие обратных связей с задержкой, которые позволяют сети учитывать динамику временного ряда.
Narx-сеть можно реализовать в Synaptic через комбинацию следующих элементов:
Пример концептуальной схемы Narx-сети в Synaptic:
[input(t), input(t-1), ..., exog(t), exog(t-1), ...] --> [Hidden Layer] --> [Output(t)]
const synaptic = require('synaptic');
const { Layer, Network } = synaptic;
let inputLayer = new Layer(5); // 3 прошлых значения сигнала + 2 внешних входа
let hiddenLayer = new Layer(10);
let outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
let narxNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
Для Narx важно хранить историю сигналов. Можно использовать очередь фиксированной длины:
class DelayBuffer {
constructor(size) {
this.buffer = [];
this.size = size;
}
push(value) {
this.buffer.push(value);
if (this.buffer.length > this.size) {
this.buffer.shift();
}
}
getValues() {
return this.buffer;
}
}
Использование буфера позволяет формировать вектор входов сети:
let delay = new DelayBuffer(3);
delay.push(currentSignal);
let networkInput = [...delay.getValues(), ...exogenousInput];
narxNetwork.activate(networkInput);
Synaptic поддерживает обучение методом обратного распространения ошибки через Trainer.
const trainer = new synaptic.Trainer(narxNetwork);
trainer.train(trainingSet, {
rate: 0.01,
iterations: 20000,
error: 0.005,
shuffle: true,
log: 1000
});
Данные для Narx-сети требуют формирования входных и выходных векторов с учетом задержек:
let trainingSet = [];
for (let t = maxDelay; t < series.length; t++) {
let inputVector = series.slice(t - maxDelay, t).concat(exogenousSeries.slice(t - maxDelay, t));
let outputVector = [series[t]];
trainingSet.push({ input: inputVector, output: outputVector });
}
После обучения сеть может использоваться для пошагового прогнозирования будущих значений временного ряда:
let predictionBuffer = new DelayBuffer(maxDelay);
series.slice(0, maxDelay).forEach(v => predictionBuffer.push(v));
for (let t = maxDelay; t < futureSteps; t++) {
let inputVector = [...predictionBuffer.getValues(), ...futureExogenous[t]];
let prediction = narxNetwork.activate(inputVector)[0];
predictionBuffer.push(prediction);
}
Особенность Narx-сети заключается в накоплении ошибок предсказания, поэтому важно проверять качество прогнозов на тестовой выборке и при необходимости корректировать архитектуру или параметры обучения.
Использование этих методов совместно с тщательно подобранными задержками и экзогенными входами позволяет добиться высокой точности прогнозов при работе с нелинейными временными рядами.