Простой пример использования нейронной сети в PHP

С помощью нейронных сетей я постарался определить безопасно ли плавать в море, с учетом следующих параметров: время суток (день/ночь), туман (задается дробным числом), волны (есть/нет), акулы (есть/нет). 

Для обучения нейронной сети я использовал следующие данные:

День (-1) / Ночь (1) Туман: Волны: есть (1), нет (-1) Акулы: есть (1), нет (-1) Опасно (1), нет (-1)
-1 0,50 -1 -1 -1
-1 0,10 -1 -1 -1
-1 0,00 1 -1 -1
1 0,00 -1 -1 -1
1 0,00 1 1 1
1 0,30 1 -1 1
1 0,00 1 -1 1
1 0,50 -1 -1 1
-1 0,50 -1 1 1
-1 0,00 -1 1 1

Реализация 
Для начала создадим файл данных, я его назвал sea.data. В этот файл внесем параметры из таблицы.

10 4 1
-1 0.50 -1 -1
-1
-1 0.10 -1 -1
-1
-1 0.00 1 -1
-1
1 0.00 -1 -1
-1
1 0.00 1 1
1
1 0.30 1 -1
1
1 0.00 1 -1
1
1 0.50 -1 -1
1
-1 0.50 -1 1
1
-1 0.00 -1 1
1

В первой строке 10 – это количество строк входных данных. Можете посчитать количество строк в таблице и удостовериться, что у нас их 10. Далее, 4 – это число входных данных (время суток, туман, волны, акулы); 1 – это число выходных данных, нейронная сеть должна выдавать -1 или 1. Хотя как оказалось, чаще всего получается приближенное число. 

В следующих строчках входные и выходные данные чередуются (сначала входные, а затем выходные). 

Создадим php-файл, в котором обучим нейронную сеть решать нашу задачу. Код в этом файле должен быть следующим:

$num_input = 4;
$num_output = 1;
$num_layers = 3;
$num_neurons_hidden = 130;
$desired_error = 0.0001;
$max_epochs = 100000;
$epochs_between_reports = 1000;
$ann = fann_create_standard($num_layers, $num_input, $num_neurons_hidden, $num_output);
if ($ann) {
    fann_set_activation_function_hidden($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_activation_function_output($ann, FANN_SIGMOID_SYMMETRIC);
    fann_set_training_algorithm($ann, FANN_TRAIN_QUICKPROP);
    $filename = dirname(__FILE__) . "/sea.data";
    if (fann_train_on_file($ann, $filename, $max_epochs, $epochs_between_reports, $desired_error))
        fann_save($ann, dirname(__FILE__) . "/sea_float.net");
    fann_destroy($ann);
}

Параметры $num_neurons_hidden и $max_epochs подбираются экспериментальным путем. 

Теперь осталось создать еще один php-файл для проверки того, как обученная нейронная сеть решает нашу задачу. Код в этом файле должен быть следующим:

$sea_file = (dirname(__FILE__) . "/sea_float.net");
if (!is_file($sea_file))
    die("Файл sea_float.net не был создан! Перезапустите главный файл, чтобы его создать");
$ann = fann_create_from_file($sea_file);
if (!$ann)
    die("ANN не была создана");
$input = array(-1, 0.10, -1, 1); // вносим тестовые данные
$calc_out = fann_run($ann, $input);
echo "С параметрами моря:<br>";
echo ($input[0] != 1) ? 'день<br>' : 'ночь<br>';
echo ($input[1] == 0.00) ? 'нет тумана<br>' : "есть туман ($input[1])<br>";
echo ($input[2] != 1) ? 'нет волн<br>' : 'есть волны<br>';
echo ($input[3] != 1) ? 'нет акул<br>' : 'есть акулы<br>';
if (round($calc_out[0]) == 1)
    printf("плавать опасно (%.2f).", $calc_out[0]);
else
    printf("плавать не опасно (%.2f).", $calc_out[0]);
fann_destroy($ann);

Результаты работы нейронной сети вы можете видеть в таблице:

День (-1) / Ночь (1) Туман: Волны: есть (1), нет (-1) Акулы: есть (1), нет (-1) Опасно (1), нет (-1)
1 0,00 -1 -1 -0.97
1 0,60 -1 -1 1.00
1 0,10 -1 -1 -0.86
1 0,45 -1 -1 0.95
1 0,10 1 -1 0.99
-1 0,10 1 -1 -0.98
-1 0,10 -1 1 1.00

Наглядный пример работы нейронной сети с одним из наборов входных данных:

Дополнение. О том как установить FANN в Линуксе 
Я работал с FANN в Linux Mint, соответственно все нижеизложенное подойдет и для другой Debian-системы. 

В первую очередь нужно установить библиотеку libfann, если она не установлена.

sudo apt install libfann-dev

Затем нужно установить php-pear и php-dev той же командой (apt install). 

А также само расширение FANN для PHP:

sudo pecl install fann