#!/usr/bin/perl -w use strict; use warnings; my $numberofinputnodes = 2; my $numberofhiddennodes = 2; my $learningrate = .1; my $maxepochs = 10; my $errormargin = .1; my @weight = (.6,.6,.6); my @hiddenweight = (.6,.6,.6); my @data = (["-1","0.000000","0.000000","0"],["-1","0.000000","1.000000","1"], ["-1","1.000000","0.000000","1"],["-1","1.000000","1.000000","0"]); my $numberofepochs = 1; my $net = 0; my $netk = 0; my $avgrmse = 0; my @outputh = (); my @outputk = (); my $deltak = 0; my $deltah = 0; my @rmse = (); my $maxrmse =0; while (($numberofepochs <= $maxepochs) && (($avgrmse == 0) || ($avgrmse >= $errormargin))){ $avgrmse = 0; for (my $j=0; $j <= $#data; $j++) { for (my $k=0; $k < $#{$data[0]}; $k++){ $net = $net + $weight[$k]*$data[$j][$k]; } $outputh[$j] = 1 / (1 + exp(-$net)); $net=0; for (my $o = 0; $o <= $numberofhiddennodes; $o++){ if ($o==0){ $netk = -$hiddenweight[0]; } $netk = $netk + $hiddenweight[$o]*$outputh[$j]; } $outputk[$j] = 1 / (1 + exp(-$netk)); $netk=0; $deltak = $outputk[$j]*(1 - $outputk[$j])*($data[$j][-1] - $outputk[$j]); my @deltah; for (my $o = 0; $o < $#{$data[0]}; $o++){ $deltah[$o] = $outputh[$j]*(1-$outputh[$j])*$weight[$o]*$deltak; } for (my $m=0; $m < $#{$data[0]}; $m++){ my $update = $learningrate*$deltah[$m]*$data[$j][$m]; $weight[$m] = $weight[$m] + $update; } for (my $n=0; $n <= $numberofhiddennodes; $n++){ my $update = $learningrate*$deltak*$outputk[$j]; $hiddenweight[$n] = $hiddenweight[$n] + $update; } $deltak=0; @deltah = (); } for (my $j=0; $j <= $#data; $j++) { for (my $k=0; $k < $#{$data[0]}; $k++){ $net = $net + $weight[$k]*$data[$j][$k]; } $outputh[$j] = 1 / (1 + exp(-$net)); for (my $o = 1; $o < $numberofhiddennodes; $o++){ $netk = $netk + $hiddenweight[$o]*$outputh[$j]; } $netk = $netk - $hiddenweight[0]; $outputk[$j] = 1 / (1 + exp(-$netk)); $net = 0; $netk = 0; } my $totalrmse = 0; for my $q (0..$#data){ $rmse[$q] = sqrt(($data[$q][-1] - $outputk[$q])**2); $totalrmse = $totalrmse + $rmse[$q]; } $avgrmse = $totalrmse / ($#data +1); @rmse = sort( {$a <=> $b} @rmse); $maxrmse = $rmse[-1]; if($numberofepochs==$maxepochs){ print "\n","***** Epoch $numberofepochs *****", "\n"; print "Maximum RMSE: $maxrmse", "\n"; print "Average RMSE: $avgrmse", "\n"; } @rmse = (); $totalrmse = 0; $numberofepochs++; } exit;