Brain.js — это библиотека для нейросетевого программирования на JavaScript, которая позволяет создавать и обучать модели для задач классификации, регрессии и прогнозирования. В сочетании с WebSocket она становится мощным инструментом для обработки потоковых данных в реальном времени, таких как финансовые котировки, телеметрия устройств или пользовательская активность.
Для начала необходимо установить пакет WebSocket и Brain.js:
npm install brain.js ws
Создание WebSocket-сервера выполняется следующим образом:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', ws => {
console.log('Новое подключение установлено');
ws.on('message', message => {
handleIncomingData(JSON.parse(message));
});
});
Ключевой момент: данные, поступающие через WebSocket, необходимо приводить к формату, удобному для обработки нейросетью. В Brain.js это обычно массивы чисел или объекты с числовыми свойствами.
Brain.js работает с входными и выходными значениями в диапазоне [0,1]. Если данные приходят в другом диапазоне, требуется нормализация:
function normalizeData(data) {
return data.map(value => value / 100);
}
function denormalizeData(normalized, max) {
return normalized.map(value => value * max);
}
Пример потока данных от WebSocket:
{"temperature": 23, "humidity": 70}
Для нейросети данные можно преобразовать так:
const input = normalizeData([data.temperature, data.humidity]);
В Brain.js доступно несколько типов сетей. Для потоковых данных часто используется recurrent neural network (RNN) или LSTM, так как они умеют учитывать последовательность и временную зависимость.
const brain = require('brain.js');
const net = new brain.recurrent.LSTM();
const trainingData = [
{ input: [0.23, 0.70], output: [0.25] }, // пример прогнозирования температуры
{ input: [0.24, 0.68], output: [0.26] },
];
net.train(trainingData, {
iterations: 2000,
learningRate: 0.01,
log: true,
logPeriod: 100
});
Особенности обучения для потоков:
После создания сети можно выполнять прогнозирование при получении новых сообщений:
function handleIncomingData(data) {
const input = normalizeData([data.temperature, data.humidity]);
const prediction = net.run(input);
const predictedValue = denormalizeData([prediction], 100)[0];
console.log(`Прогноз температуры: ${predictedValue.toFixed(2)}°C`);
}
Ключевой момент: при потоковых данных важно учитывать задержку между поступлением данных и прогнозом. Для минимизации задержки можно предобучить модель на исторических данных и использовать обновление весов онлайн.
Brain.js позволяет добавлять новые данные в уже обученную сеть,
используя метод train на отдельных примерах. Это позволяет
адаптироваться к изменяющимся потокам данных:
function updateNetwork(data) {
const input = normalizeData([data.temperature, data.humidity]);
const output = normalizeData([data.nextTemperature]); // если известен "истинный" результат
net.train([{ input, output }], {
iterations: 100,
learningRate: 0.005
});
}
Рекомендации для потокового обучения:
Для потоковых приложений важно, чтобы вычисления нейросети не тормозили обработку сообщений:
Пример асинхронного вызова прогнозирования:
wss.on('connection', ws => {
ws.on('message', async message => {
const data = JSON.parse(message);
const prediction = await predictTemperatureAsync(data);
ws.send(JSON.stringify({ prediction }));
});
});
async function predictTemperatureAsync(data) {
return new Promise(resolve => {
const input = normalizeData([data.temperature, data.humidity]);
const prediction = net.run(input);
resolve(denormalizeData([prediction], 100)[0]);
});
}
Для крупных проектов целесообразно:
const fs = require('fs');
const netJSON = net.toJSON();
fs.writeFileSync('network.json', JSON.stringify(netJSON));
Загрузка сети при старте:
const savedNet = JSON.parse(fs.readFileSync('network.json'));
net.fromJSON(savedNet);
Brain.js в связке с WebSocket позволяет строить реактивные нейросетевые системы, способные работать с непрерывными потоками информации, обеспечивая прогнозирование, классификацию и обработку событий в реальном времени.