Gradient descent: Difference between revisions
Content added Content deleted
m (→{{header|Perl 6}}: more mindless golfing) |
|||
Line 202: | Line 202: | ||
use v6.d; |
use v6.d; |
||
sub steepestDescent(@x, $alpha is copy, $ |
sub steepestDescent(@x, $alpha is copy, $h is copy) { |
||
my \N = +@x ; my $h = $tolerance ; |
|||
⚫ | |||
my $g0 = g(@x) ; # Initial estimate of result. |
|||
# Calculate initial |
my @fi = gradG(@x, $h, $g0) ; # Calculate initial gradient |
||
⚫ | |||
⚫ | |||
while ( $delG > $tolerance ) { # Iterate until value is <= tolerance. |
|||
⚫ | |||
⚫ | |||
for ^N { @x[$_] -= $b * @fi[$_] } |
|||
$h /= 2; |
|||
while ( $delG > $h ) { # Iterate until value is <= tolerance. |
|||
# Calculate next |
for @fi.kv -> $i, $j { @x[$i] -= $b * $j } # Calculate next value. |
||
$b = $alpha / ($delG = (map {@fi[$_]²}, ^N).sum ).sqrt; |
|||
@fi = gradG(@x, $h /= 2, g(@x)); # Calculate next gradient. |
|||
$b = $alpha / sqrt($delG = sum(map {$_²}, @fi) ); # Calculate next norm. |
|||
⚫ | |||
⚫ | |||
$g1 > $g0 ?? ( $alpha /= 2 ) !! ( $g0 = $g1 ) # Adjust parameter. |
|||
⚫ | |||
} |
} |
||
sub gradG(@x, $h) { |
sub gradG(@x is copy, $h, $g0) { # gives a rough calculation of gradient g(x). |
||
return map { $_ += $h ; (g(@x) - $g0) / $h }, @x |
|||
return map { @y[$_] += $h ; (g(@y) - $g0) / $h }, ^N |
|||
} |
} |
||
# Function for which minimum is to be found. |
# Function for which minimum is to be found. |
||
sub g(\x) { (x[0]-1)² * (-x[1]²) |
sub g(\x) { (x[0]-1)² * exp(-x[1]²) + x[1]*(x[1]+2) * exp(-2*x[0]²) } |
||