Brain.js — это библиотека на JavaScript для создания нейронных сетей, способная выполнять задачи классификации, регрессии и прогнозирования. В основе работы лежат искусственные нейронные сети, где каждый нейрон обрабатывает входные данные, применяет веса и функцию активации, формируя выходной сигнал.
Для начала необходимо подключение библиотеки через npm:
const brain = require('brain.js');
Создание сети выполняется путем инициализации соответствующего
класса. Например, для простой полносвязной нейронной сети используется
NeuralNetwork:
const net = new brain.NeuralNetwork();
Сеть принимает массив объектов, где каждый объект содержит
input и output:
const trainingData = [
{ input: { red: 1, green: 0, blue: 0 }, output: { color: 'red' } },
{ input: { red: 0, green: 1, blue: 0 }, output: { color: 'green' } },
{ input: { red: 0, green: 0, blue: 1 }, output: { color: 'blue' } }
];
Метод обучения train запускает процесс подбора весов
нейронной сети:
net.train(trainingData, {
iterations: 20000,
learningRate: 0.5,
log: true,
logPeriod: 1000
});
После тренировки сеть способна классифицировать новые данные:
const output = net.run({ red: 0.8, green: 0.1, blue: 0.1 });
console.log(output); // Выдаст наиболее вероятный цвет
iterations — количество итераций обучения. Большие значения повышают точность, но увеличивают время обучения. learningRate — скорость обучения сети. Оптимальные значения обычно находятся в диапазоне 0.1–0.5. hiddenLayers — массив, задающий количество и размер скрытых слоев. Например:
const net = new brain.NeuralNetwork({ hiddenLayers: [3, 2] });
Это создаст сеть с двумя скрытыми слоями, первый из которых содержит 3 нейрона, второй — 2 нейрона. Настройка скрытых слоев критична для сложных задач классификации, так как она определяет способность сети выявлять нелинейные зависимости.
Для классификации числовых признаков можно использовать нормализацию входных данных. Пример: классификация возраста на группы.
const ageData = [
{ input: { age: 5 }, output: { child: 1 } },
{ input: { age: 16 }, output: { teen: 1 } },
{ input: { age: 25 }, output: { adult: 1 } },
{ input: { age: 70 }, output: { senior: 1 } }
];
const ageNet = new brain.NeuralNetwork({ hiddenLayers: [3] });
ageNet.train(ageData, { iterations: 10000, learningRate: 0.3 });
const result = ageNet.run({ age: 20 });
console.log(result); // Выдаст вероятности принадлежности к каждой категории
Использование нормализации данных позволяет сети быстрее обучаться и снижает риск переобучения.
Brain.js может работать с категориальными данными через кодирование «one-hot». Например, для классификации животных:
const animalData = [
{ input: { mammal: 1, fly: 0 }, output: { dog: 1 } },
{ input: { mammal: 1, fly: 1 }, output: { bat: 1 } },
{ input: { mammal: 0, fly: 1 }, output: { eagle: 1 } }
];
const animalNet = new brain.NeuralNetwork({ hiddenLayers: [4] });
animalNet.train(animalData, { iterations: 15000 });
const prediction = animalNet.run({ mammal: 1, fly: 0 });
console.log(prediction); // Предскажет вероятный вид животного
Ключевой момент — правильное кодирование категориальных признаков. Любая ошибка в представлении данных приведет к снижению точности классификации.
Для работы с текстом часто используют NeuralNetwork
совместно с преобразованием текста в числовые векторы. Простейший способ
— использование мешка слов (bag of words).
const textData = [
{ input: { happy: 1, sad: 0 }, output: { positive: 1 } },
{ input: { happy: 0, sad: 1 }, output: { negative: 1 } }
];
const textNet = new brain.NeuralNetwork({ hiddenLayers: [3] });
textNet.train(textData, { iterations: 20000, learningRate: 0.4 });
const resultText = textNet.run({ happy: 0.7, sad: 0.2 });
console.log(resultText); // Вероятность положительной или отрицательной эмоции
Для крупных текстов рекомендуется использовать TF-IDF или более сложные методы кодирования слов, чтобы уменьшить размер входного вектора и повысить качество классификации.
Для задач, где важен порядок входных данных, применяются рекуррентные
нейронные сети recurrent.LSTM. Пример классификации
последовательности чисел:
const { LSTM } = require('brain.js');
const seqNet = new LSTM();
seqNet.train([
{ input: [1, 2, 3], output: [0] },
{ input: [3, 2, 1], output: [1] }
], { iterations: 10000, learningRate: 0.3 });
const seqResult = seqNet.run([2, 3, 4]);
console.log(seqResult); // Выдаст вероятностное значение
Рекуррентные сети позволяют учитывать контекст предыдущих элементов последовательности, что критично для задач временных рядов и анализа текста.
learningRate, чтобы
найти баланс между скоростью обучения и стабильностью сети.Эти подходы позволяют эффективно применять Brain.js для классификации различных типов данных: числовых, категориальных, текстовых и последовательных. Правильная подготовка данных и настройка параметров сети являются ключевыми для получения точных и надежных результатов.