Генерирует веса, решает задачу XOR
Спойлер (Отобразить)
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- function f($s) {
- }
- function df($s){
- $val =f($s);
- return $val*(1-$val);
- }
- function w($ns) {
- $w = [];
- //строим веса
- foreach ($ns as $u => $ct) {
- if ($u == 0) {
- continue;
- }
- for ($kt = 1; $kt <= $ct; $kt++) {
- for ($kf = 0; $kf <= $ns[$u-1]; $kf++) {
- $w[$u][$kt][$kf] =
- $w[$u][$kt][$kf] == 0
- ?0.1
- :$w[$u][$kt][$kf];
- }
- }
- }
- return $w;
- }
- function p($v){
- }
- function i(&$xy, &$w, &$s, &$i){
- //$s=[];
- //$i=[];
- $i=[];
- $i[0]=$xy['x'];
- foreach ($i[0] as $ki=>$vi){
- $i[0][$ki] = f($i[0][$ki]);
- }
- $s=[];
- echo "\n";
- foreach ($w as $u=>$lt){
- $i[$u-1][0]=1;
- }
- foreach ($lt as $kt=>$lf){
- //echo "[$u,$kt]";
- foreach ($lf as $kf=>$vw){
- $s[$u][$kt]=0;
- }
- //echo "w[$u][$kt][$kf]*i[".($u-1)."][$kf] = ";
- //echo ($w[$u][$kt][$kf]*$i[$u-1][$kf])."\n";
- $s[$u][$kt]+=
- $w[$u][$kt][$kf]*$i[$u-1][$kf];
- echo "w[$u][$kt][$kf]*i[".($u-1).",$kf] = "
- .p($w[$u][$kt][$kf]).'* '.p($i[$u-1][$kf]).'= ';
- echo p($w[$u][$kt][$kf]*$i[$u-1][$kf])."\n";
- //echo $s[$u][$kt]."\n";
- }
- //echo "\n";
- $i[$u][$kt]=f($s[$u][$kt]);
- //echo "s=".$s[$u][$kt].' ';
- echo "s[$u][$kt]=".p($s[$u][$kt])
- .' ';
- echo "i[$u][$kt]=".p($i[$u][$kt])
- ."\n";
- }
- }
- //print_r(['$y'=>$xy['y'][1], '$i'=>$i[$ur][1]]);
- $ur=array_key_last($i);
- //print_r(['$i'=>$i, '$w'=>$w]);
- }
- $step=20000;
- $a=$da=0.5;
- /*
- $data=[
- ['x'=>[1, 50, 50], 'y'=>[1=>1 ]]
- , ['x'=>[1, 20, 20], 'y'=>[1=>1 ]]
- , ['x'=>[1, 50, 20], 'y'=>[1=>0 ]]
- , ['x'=>[1, 20, 50], 'y'=>[1=>0 ]]
- //, ['x'=>[1=> -30], 'y'=>[1=>0 ]]
- //, ['x'=>[1=>10], 'y'=>[1=>0]]
- //, ['x'=>[1=>30], 'y'=>[1=>0]]
- ];
- */
- $data=[
- ['x'=>[1=>-1, 1], 'y'=>[1=>1 ]]
- , ['x'=>[1=>1 , 0], 'y'=>[1=>1 ]]
- , ['x'=>[1=>0 , 0], 'y'=>[1=>0 ]]
- , ['x'=>[1=>1, 1], 'y'=>[1=>0 ]]
- ];
- $s=[];
- $e=[];
- /*
- $w=array (
- 1 =>
- array (
- 1 =>
- array (
- // 0 => 0.07,
- 1 => -0.02,
- 2 => -0.01,
- ),
- 2 =>
- array (
- // 0 => 0.02,
- 1 => -0.05,
- 2 => 0.05,
- ),
- 3 =>
- array (
- //0 => -0.09,
- 1 => 0.07,
- 2 => -0.07,
- ),
- ),
- 2 =>
- array (
- 1 =>
- array (
- //0 => 0.03,
- 1 => 0.07,
- 2 => -0.06,
- 3 => 0.1,
- ),
- 2 =>
- array (
- // 0 => -0.01,
- 1 => -0.01,
- 2 => 0.04,
- 3 => -0.04,
- ),
- 3 =>
- array (
- // 0 => 0.03,
- 1 => -0.04,
- 2 => 0.05,
- 3 => -0.01,
- ),
- ),
- 3 =>
- array (
- 1 =>
- array (
- // 0 => -0.1,
- 1 => -0.01,
- 2 => -0.09,
- 3 => 0.02,
- ),
- ),
- );
- */
- $w=w([2, 2, 2, 1]);
- /*
- print_r(var_export($w,1));
- exit;
- */
- $sw=0;
- for($k=0; $k<$step; $k++){
- $mse=0;
- echo "\n\n$k\n";
- foreach ($data as $xy){
- $i=[];
- $i[0]=$xy['x'];
- $s=[];
- // нейрон
- i($xy, $w, $s, $i);
- //echo $it;
- //ksort($i[0]);
- //print_r(['$y'=>$xy['y'][1], '$i'=>$i]);
- $ur=array_key_last($i);
- //echo '$ur='.$ur."\n";
- $e = [];
- $se=0;
- $ske=0;
- // ошибка
- $e[$ur][1] =
- $xy['y'][1]-$i[$ur][1];
- //$se+=pow(($e[$ur][$ki]),2);
- //$ske++;
- echo ' i='.$i[$ur][1]."\n";
- echo " e[$ur][1]=".$e[$ur][1]."\n";
- //пересчет ошибок
- for ($u=$ur; $u>1; $u--){
- foreach ($w[$u] as $kt=>$lf){
- if ($kt==0){
- continue;
- }
- foreach ($w[$u][$kt] as $kf=>$vw){
- $e[$u-1][$kf]=0;
- }
- $e[$u-1][$kf]+=
- $w[$u][$kt][$kf]*$e[$u][$kt];
- }
- }
- }
- // пересчет весов
- for ($u=$ur; $u>=1; $u--){
- //print_r(['$e'=>$e, '$u'=>$u]);
- //echo " $u\n";
- foreach ($w[$u] as $kt=>$lt){
- //print_r(['$lt'=>$lt]);
- //нейрон
- //echo "$kt\n";
- //rsort($i[$u-1]);
- /*
- $i[$u-1] = array_map(function($val){
- return substr($val, 0, 6);
- }, $i[$u-1]);*/
- echo " $u $kt i["
- //сумма весов к нейрону
- foreach ($lt as $kf=>$vw){
- $dw= (
- $a
- * df($s[$u][$kt])
- * $e[$u][$kt]
- * $i[$u-1][$kf]
- );
- echo "dw[$u,$kt]=\n";
- echo ' $a='.p($a)."\n";
- echo ' df='.p(df($s[$u][$kt]))."\n";
- echo ' e='.p($e[$u][$kt])."\n";
- echo ' i='.p($i[$u-1][$kf])."\n";
- echo " =$dw\n";
- $w[$u][$kt][$kf]+=$dw;
- /*1
- //* df($s[$u][$kt])
- * (
- $e[$u][$kt] / $sw
- //* abs($w[$u][$kt][$kf])
- * $w[$u][$kt][$kf]
- )
- //* $i[$u-1][$kf]
- * $a
- ;
- echo "1*({$e[$u][$kt]}/$sw*"
- //.abs($w[$u][$kt][$kf])
- .$w[$u][$kt][$kf]
- .")*$a \n";
- echo "dw=".(1
- //* df($s[$u][$kt])
- * (
- $e[$u][$kt] / $sw
- //* abs($w[$u][$kt][$kf])
- * $w[$u][$kt][$kf]
- )
- //* $i[$u-1][$kf]
- * $a)."\n";
- */
- echo " w={$w[$u][$kt][$kf]} \n";
- /*
- if ($w[$u][$kt][$kf]==NAN){
- exit;
- }
- */
- }
- //print_r(['$w'=>$w]);
- }
- }
- //echo $et;
- echo "re \n";
- i($xy, $w, $s, $i);
- echo "er\n";
- //echo $it2;
- }
- //$mse=pow($mse, 0.5);
- echo " == mse=$mse \n\n";
- }
- echo "-----\n";
- for($k=0;$k<1; $k++){
- // гручим результат
- foreach ($data as $xy){
- $i=[];
- $i[0]=$xy['x'];
- foreach ($i[0] as $ki=>$vi){
- //$i[0][$ki] = f($i[0][$ki]);
- }
- $s=[];
- i($xy, $w, $s, $i);
- //echo $it;
- echo ' $y='.$xy['y'][1].' $i='.$i[$ur][1]."\n";
- }
- }