implement RBF kernel function

This commit is contained in:
Arkadiusz Kondas 2016-04-21 22:54:38 +02:00
parent b30f4cbf11
commit 37782eba98
3 changed files with 82 additions and 0 deletions

17
src/Phpml/Math/Kernel.php Normal file
View File

@ -0,0 +1,17 @@
<?php
declare(strict_types = 1);
namespace Phpml\Math;
interface Kernel
{
/**
* @param float $a
* @param float $b
*
* @return float
*/
public function compute($a, $b);
}

View File

@ -0,0 +1,39 @@
<?php
declare(strict_types = 1);
namespace Phpml\Math\Kernel;
use Phpml\Math\Kernel;
use Phpml\Math\Product;
class RBF implements Kernel
{
/**
* @var float
*/
private $gamma;
/**
* @param float $gamma
*/
public function __construct(float $gamma)
{
$this->gamma = $gamma;
}
/**
* @param float $a
* @param float $b
*
* @return float
*/
public function compute($a, $b)
{
$score = 2 * Product::scalar($a, $b);
$squares = Product::scalar($a, $a) + Product::scalar($b, $b);
$result = exp(-$this->gamma * ($squares - $score));
return $result;
}
}

View File

@ -0,0 +1,26 @@
<?php
declare(strict_types = 1);
namespace test\Phpml\Math\Kernel;
use Phpml\Math\Kernel\RBF;
class RBFTest extends \PHPUnit_Framework_TestCase
{
public function testComputeRBFKernelFunction()
{
$rbf = new RBF($gamma = 0.001);
$this->assertEquals(1, $rbf->compute([1, 2], [1, 2]));
$this->assertEquals(0.97336, $rbf->compute([1, 2, 3], [4, 5, 6]), '', $delta = 0.0001);
$this->assertEquals(0.00011, $rbf->compute([4, 5], [1, 100]), '', $delta = 0.0001);
$rbf = new RBF($gamma = 0.2);
$this->assertEquals(1, $rbf->compute([1, 2], [1, 2]));
$this->assertEquals(0.00451, $rbf->compute([1, 2, 3], [4, 5, 6]), '', $delta = 0.0001);
$this->assertEquals(0, $rbf->compute([4, 5], [1, 100]));
}
}