cii-text-analysis/vendor/rubix/ml/tests/NeuralNet/CostFunctions/RelativeEntropyTest.php

179 lines
4.1 KiB
PHP
Raw Permalink Normal View History

2026-02-10 16:19:59 +01:00
<?php
namespace Rubix\ML\Tests\NeuralNet\CostFunctions;
use Tensor\Matrix;
use Rubix\ML\NeuralNet\CostFunctions\RelativeEntropy;
use Rubix\ML\NeuralNet\CostFunctions\CostFunction;
use PHPUnit\Framework\TestCase;
use Generator;
/**
* @group CostFunctions
* @covers \Rubix\ML\NeuralNet\CostFunctions\RelativeEntropy
*/
class RelativeEntropyTest extends TestCase
{
/**
* @var \Rubix\ML\NeuralNet\CostFunctions\RelativeEntropy
*/
protected $costFn;
/**
* @before
*/
protected function setUp() : void
{
$this->costFn = new RelativeEntropy();
}
/**
* @test
*/
public function build() : void
{
$this->assertInstanceOf(RelativeEntropy::class, $this->costFn);
$this->assertInstanceOf(CostFunction::class, $this->costFn);
}
/**
* @test
* @dataProvider computeProvider
*
* @param \Tensor\Matrix $output
* @param \Tensor\Matrix $target
* @param float $expected
*/
public function compute(Matrix $output, Matrix $target, float $expected) : void
{
$loss = $this->costFn->compute($output, $target);
$this->assertEquals($expected, $loss);
}
/**
* @return \Generator<array>
*/
public function computeProvider() : Generator
{
yield [
Matrix::quick([
[0.99, 0.01, 0.0],
]),
Matrix::quick([
[1.0, 0.0, 0.0],
]),
0.003350065899465309,
];
yield [
Matrix::quick([
[0.2, 0.4, 0.4],
]),
Matrix::quick([
[0.0, 1.0, 0.0],
]),
0.3054301295726089,
];
yield [
Matrix::quick([
[0.0, 0.1, 0.9],
]),
Matrix::quick([
[1.0, 0.0, 0.0],
]),
6.140226799872736,
];
yield [
Matrix::quick([
[0.2, 0.1, 0.7],
[0.0, 0.9, 0.1],
[0.1, 0.3, 0.6],
]),
Matrix::quick([
[0.0, 0.0, 1.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
]),
0.10809558439335247,
];
}
/**
* @test
* @dataProvider differentiateProvider
*
* @param \Tensor\Matrix $output
* @param \Tensor\Matrix $target
* @param array[] $expected
*/
public function differentiate(Matrix $output, Matrix $target, array $expected) : void
{
$gradient = $this->costFn->differentiate($output, $target)->asArray();
$this->assertEquals($expected, $gradient);
}
/**
* @return \Generator<array>
*/
public function differentiateProvider() : Generator
{
yield [
Matrix::quick([
[0.99, 0.01, 0.0],
]),
Matrix::quick([
[1.0, 0.0, 0.0],
]),
[
[-0.01010101010101011, 0.999999, 0.0],
],
];
yield [
Matrix::quick([
[0.2, 0.4, 0.4],
]),
Matrix::quick([
[0.0, 1.0, 0.0],
]),
[
[0.9999999500000001, -1.4999999999999998, 0.999999975],
],
];
yield [
Matrix::quick([
[0.0, 0.1, 0.9],
]),
Matrix::quick([
[1.0, 0.0, 0.0],
]),
[
[-99999999.0, 0.9999999, 0.9999999888888889],
],
];
yield [
Matrix::quick([
[0.2, 0.1, 0.7],
[0.0, 0.9, 0.1],
[0.1, 0.3, 0.6],
]),
Matrix::quick([
[0.0, 0.0, 1.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
]),
[
[0.9999999500000001, 0.9999999, -0.42857142857142866],
[0.0, -0.11111111111111108, 0.9999999],
[0.9999999, 0.9999999666666667, -0.6666666666666667],
],
];
}
}