forked from jorgecasas/php-ml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStochasticGDTest.php
65 lines (50 loc) · 1.81 KB
/
StochasticGDTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
declare(strict_types=1);
namespace Phpml\Tests\Helper\Optimizer;
use Phpml\Helper\Optimizer\StochasticGD;
use PHPUnit\Framework\TestCase;
class StochasticGDTest extends TestCase
{
public function testRunOptimization(): void
{
// 200 samples from y = -1 + 2x (i.e. theta = [-1, 2])
$samples = [];
$targets = [];
for ($i = -100; $i <= 100; ++$i) {
$x = $i / 100;
$samples[] = [$x];
$targets[] = -1 + 2 * $x;
}
$callback = static function ($theta, $sample, $target): array {
$y = $theta[0] + $theta[1] * $sample[0];
$cost = (($y - $target) ** 2) / 2;
$grad = $y - $target;
return [$cost, $grad];
};
$optimizer = new StochasticGD(1);
$theta = $optimizer->runOptimization($samples, $targets, $callback);
self::assertEqualsWithDelta([-1, 2], $theta, 0.1);
}
public function testRunOptimization2Dim(): void
{
// 100 samples from y = -1 + 2x0 - 3x1 (i.e. theta = [-1, 2, -3])
$samples = [];
$targets = [];
for ($i = 0; $i < 100; ++$i) {
$x0 = intval($i / 10) / 10;
$x1 = ($i % 10) / 10;
$samples[] = [$x0, $x1];
$targets[] = -1 + 2 * $x0 - 3 * $x1;
}
$callback = static function ($theta, $sample, $target): array {
$y = $theta[0] + $theta[1] * $sample[0] + $theta[2] * $sample[1];
$cost = (($y - $target) ** 2) / 2;
$grad = $y - $target;
return [$cost, $grad];
};
$optimizer = new StochasticGD(2);
$optimizer->setChangeThreshold(1e-6);
$theta = $optimizer->runOptimization($samples, $targets, $callback);
self::assertEqualsWithDelta([-1, 2, -3], $theta, 0.1);
}
}