Advertisement
Geograph

NumberRecognizer.php

Feb 11th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.34 KB | None | 0 0
  1. <?php
  2.   // Цифры (Обучающая выборка)
  3.   $num0 = str_split('111101101101111');
  4.   $num1 = str_split('001001001001001');
  5.   $num2 = str_split('111001111100111');
  6.   $num3 = str_split('111001111001111');
  7.   $num4 = str_split('101101111001001');
  8.   $num5 = str_split('111100111001111');
  9.   $num6 = str_split('111100111101111');
  10.   $num7 = str_split('111001001001001');
  11.   $num8 = str_split('111101111101111');
  12.   $num9 = str_split('111101111001111');
  13.    
  14.   // Список всех вышеуказанных цифр
  15.   $nums = array($num0, $num1, $num2, $num3, $num4, $num5, $num6, $num7, $num8, $num9);
  16.    
  17.   // Виды цифры 5 (Тестовая выборка)
  18.   $num51 = str_split('111100111000111');
  19.   $num52 = str_split('111100010001111');
  20.   $num53 = str_split('111100011001111');
  21.   $num54 = str_split('110100111001111');
  22.   $num55 = str_split('110100111001011');
  23.   $num56 = str_split('111100101001111');
  24.    
  25.   // Инициализация весов сети  
  26.   $weights = array_fill(0, 15, 0);
  27.    
  28.   // Порог функции активации
  29.   $bias = 7;
  30.    
  31.   // Является ли данное число 5
  32.   function proceed($number)
  33.   {
  34.     global $bias, $weights;
  35.     // Рассчитываем взвешенную сумму
  36.     $net = 0;
  37.     for ($i = 0; $i < 15; $i++)
  38.     {
  39.       $net += $number[$i] * $weights[$i];
  40.     }
  41.     // Превышен ли порог? (Да - сеть думает, что это 5. Нет - сеть думает, что это другая цифра)
  42.     return $net >= $bias;
  43.   }
  44.  
  45.   // Уменьшение значений весов, если сеть ошиблась и выдала 1
  46.   function decrease($number)
  47.   {
  48.     global $weights;
  49.     for ($i = 0; $i < 15; $i++)
  50.     {
  51.       // Возбужденный ли вход
  52.       if ($number[$i] == 1)
  53.         // Уменьшаем связанный с ним вес на единицу
  54.         $weights[$i]--;
  55.     }
  56.   }
  57.  
  58.   // Увеличение значений весов, если сеть ошиблась и выдала 0
  59.   function increase($number)
  60.   {
  61.     global $weights;
  62.     for ($i = 0; $i < 15; $i++)
  63.     {
  64.       // Возбужденный ли вход
  65.       if ($number[$i] == 1)
  66.         // Увеличиваем связанный с ним вес на единицу
  67.         $weights[$i]++;
  68.     }
  69.   }
  70.  
  71.   // Тренировка сети
  72.   for ($i = 0; $i < 10000; $i++)
  73.   {
  74.     // Генерируем случайное число от 0 до 9
  75.     $option = rand(0, 9);
  76.  
  77.     // Если получилось НЕ число 5
  78.     if ($option != 5)    
  79.       // Если сеть выдала True/Да/1, то наказываем ее
  80.       if (proceed($nums[$option]))
  81.         decrease($nums[$option]);    
  82.     // Если получилось число 5
  83.     else
  84.       // Если сеть выдала False/Нет/0, то показываем, что эта цифра - то, что нам нужно
  85.       if (!proceed($num5))
  86.         increase($num5);
  87.   }
  88.    
  89.   // Вывод значений весов
  90.   echo join(", ", $weights) . PHP_EOL;
  91.    
  92.   // Прогон по обучающей выборке
  93.   echo "0 is 5? " . var_export(proceed($num0), true) . PHP_EOL;
  94.   echo "1 is 5? " . var_export(proceed($num1), true) . PHP_EOL;
  95.   echo "2 is 5? " . var_export(proceed($num2), true) . PHP_EOL;
  96.   echo "3 is 5? " . var_export(proceed($num3), true) . PHP_EOL;
  97.   echo "4 is 5? " . var_export(proceed($num4), true) . PHP_EOL;
  98.   echo "6 is 5? " . var_export(proceed($num6), true) . PHP_EOL;
  99.   echo "7 is 5? " . var_export(proceed($num7), true) . PHP_EOL;
  100.   echo "8 is 5? " . var_export(proceed($num8), true) . PHP_EOL;
  101.   echo "9 is 5? " . var_export(proceed($num9), true) . PHP_EOL . PHP_EOL;
  102.    
  103.   // Прогон по тестовой выборке
  104.   echo "Recognize 5? " . var_export(proceed($num5), true) . PHP_EOL;
  105.   echo "Recognize 5 - 1? " . var_export(proceed($num51), true) . PHP_EOL;
  106.   echo "Recognize 5 - 2? " . var_export(proceed($num52), true) . PHP_EOL;
  107.   echo "Recognize 5 - 3? " . var_export(proceed($num53), true) . PHP_EOL;
  108.   echo "Recognize 5 - 4? " . var_export(proceed($num54), true) . PHP_EOL;
  109.   echo "Recognize 5 - 5? " . var_export(proceed($num55), true) . PHP_EOL;
  110.   echo "Recognize 5 - 6? " . var_export(proceed($num56), true) . PHP_EOL;
  111. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement