Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- // Цифры (Обучающая выборка)
- $num0 = str_split('111101101101111');
- $num1 = str_split('001001001001001');
- $num2 = str_split('111001111100111');
- $num3 = str_split('111001111001111');
- $num4 = str_split('101101111001001');
- $num5 = str_split('111100111001111');
- $num6 = str_split('111100111101111');
- $num7 = str_split('111001001001001');
- $num8 = str_split('111101111101111');
- $num9 = str_split('111101111001111');
- // Список всех вышеуказанных цифр
- $nums = array($num0, $num1, $num2, $num3, $num4, $num5, $num6, $num7, $num8, $num9);
- // Виды цифры 5 (Тестовая выборка)
- $num51 = str_split('111100111000111');
- $num52 = str_split('111100010001111');
- $num53 = str_split('111100011001111');
- $num54 = str_split('110100111001111');
- $num55 = str_split('110100111001011');
- $num56 = str_split('111100101001111');
- // Инициализация весов сети
- $weights = array_fill(0, 15, 0);
- // Порог функции активации
- $bias = 7;
- // Является ли данное число 5
- function proceed($number)
- {
- global $bias, $weights;
- // Рассчитываем взвешенную сумму
- $net = 0;
- for ($i = 0; $i < 15; $i++)
- {
- $net += $number[$i] * $weights[$i];
- }
- // Превышен ли порог? (Да - сеть думает, что это 5. Нет - сеть думает, что это другая цифра)
- return $net >= $bias;
- }
- // Уменьшение значений весов, если сеть ошиблась и выдала 1
- function decrease($number)
- {
- global $weights;
- for ($i = 0; $i < 15; $i++)
- {
- // Возбужденный ли вход
- if ($number[$i] == 1)
- // Уменьшаем связанный с ним вес на единицу
- $weights[$i]--;
- }
- }
- // Увеличение значений весов, если сеть ошиблась и выдала 0
- function increase($number)
- {
- global $weights;
- for ($i = 0; $i < 15; $i++)
- {
- // Возбужденный ли вход
- if ($number[$i] == 1)
- // Увеличиваем связанный с ним вес на единицу
- $weights[$i]++;
- }
- }
- // Тренировка сети
- for ($i = 0; $i < 10000; $i++)
- {
- // Генерируем случайное число от 0 до 9
- $option = rand(0, 9);
- // Если получилось НЕ число 5
- if ($option != 5)
- // Если сеть выдала True/Да/1, то наказываем ее
- if (proceed($nums[$option]))
- decrease($nums[$option]);
- // Если получилось число 5
- else
- // Если сеть выдала False/Нет/0, то показываем, что эта цифра - то, что нам нужно
- if (!proceed($num5))
- increase($num5);
- }
- // Вывод значений весов
- echo join(", ", $weights) . PHP_EOL;
- // Прогон по обучающей выборке
- echo "0 is 5? " . var_export(proceed($num0), true) . PHP_EOL;
- echo "1 is 5? " . var_export(proceed($num1), true) . PHP_EOL;
- echo "2 is 5? " . var_export(proceed($num2), true) . PHP_EOL;
- echo "3 is 5? " . var_export(proceed($num3), true) . PHP_EOL;
- echo "4 is 5? " . var_export(proceed($num4), true) . PHP_EOL;
- echo "6 is 5? " . var_export(proceed($num6), true) . PHP_EOL;
- echo "7 is 5? " . var_export(proceed($num7), true) . PHP_EOL;
- echo "8 is 5? " . var_export(proceed($num8), true) . PHP_EOL;
- echo "9 is 5? " . var_export(proceed($num9), true) . PHP_EOL . PHP_EOL;
- // Прогон по тестовой выборке
- echo "Recognize 5? " . var_export(proceed($num5), true) . PHP_EOL;
- echo "Recognize 5 - 1? " . var_export(proceed($num51), true) . PHP_EOL;
- echo "Recognize 5 - 2? " . var_export(proceed($num52), true) . PHP_EOL;
- echo "Recognize 5 - 3? " . var_export(proceed($num53), true) . PHP_EOL;
- echo "Recognize 5 - 4? " . var_export(proceed($num54), true) . PHP_EOL;
- echo "Recognize 5 - 5? " . var_export(proceed($num55), true) . PHP_EOL;
- echo "Recognize 5 - 6? " . var_export(proceed($num56), true) . PHP_EOL;
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement