AI-MaxEntropy

 view release on metacpan or  search on metacpan

t/03-learn_by_gis.t  view on Meta::CPAN

use strict;
use warnings;

use Test::More tests => 3;
use Test::Number::Delta within => 1e-5;

my $__;
sub NAME { $__ = shift };

###
NAME 'Load the module';
BEGIN { use_ok 'AI::MaxEntropy' }

my ($lambda, $d_lambda, $p1_f, $n);
my $zero = 1e-5;
my $me = AI::MaxEntropy->new(); 
$me->see(['round', 'smooth', 'red'] => 'apple' => 2);
$me->see(['long', 'smooth', 'yellow'] => 'banana' => 3);
$me->{algorithm}->{type} = 'gis';

###
NAME 'The first iteration';
$me->{algorithm}->{progress_cb} =
    sub { ($lambda, $d_lambda) = ($_[1], $_[2]); 1 };
$me->learn;
$p1_f = [
    2 * (exp(0) / (exp(0) + exp(0))),
    2 * (exp(0) / (exp(0) + exp(0))) + 3 * (exp(0) / (exp(0) + exp(0))),
    2 * (exp(0) / (exp(0) + exp(0))),
    3 * (exp(0) / (exp(0) + exp(0))),
    3 * (exp(0) / (exp(0) + exp(0))),
    2 * (exp(0) / (exp(0) + exp(0))),
    2 * (exp(0) / (exp(0) + exp(0))) + 3 * (exp(0) / (exp(0) + exp(0))),
    2 * (exp(0) / (exp(0) + exp(0))),
    3 * (exp(0) / (exp(0) + exp(0))),
    3 * (exp(0) / (exp(0) + exp(0)))
];
delta_ok
[
    $lambda,
    $d_lambda
],
[
    [
        (1.0 / 3) * log(2 / $p1_f->[0]),
	(1.0 / 3) * log(2 / $p1_f->[1]),
	(1.0 / 3) * log(2 / $p1_f->[2]),
	(1.0 / 3) * log($zero / $p1_f->[3]),
	(1.0 / 3) * log($zero / $p1_f->[4]),
	(1.0 / 3) * log($zero / $p1_f->[5]),
	(1.0 / 3) * log(3 / $p1_f->[6]),
	(1.0 / 3) * log($zero / $p1_f->[7]),
	(1.0 / 3) * log(3 / $p1_f->[8]),
	(1.0 / 3) * log(3 / $p1_f->[9])
    ],
    [
        (1.0 / 3) * log(2 / $p1_f->[0]),
	(1.0 / 3) * log(2 / $p1_f->[1]),
	(1.0 / 3) * log(2 / $p1_f->[2]),
	(1.0 / 3) * log($zero / $p1_f->[3]),
	(1.0 / 3) * log($zero / $p1_f->[4]),
	(1.0 / 3) * log($zero / $p1_f->[5]),
	(1.0 / 3) * log(3 / $p1_f->[6]),
	(1.0 / 3) * log($zero / $p1_f->[7]),
	(1.0 / 3) * log(3 / $p1_f->[8]),
	(1.0 / 3) * log(3 / $p1_f->[9])
    ]
],
$__;

###
NAME 'The second iteration';
my @l = @$lambda;
$me->{algorithm}->{progress_cb} =
    sub { ($lambda, $d_lambda) = ($_[1], $_[2]); $n++; $n >= 2 ? 1 : 0 };
$me->learn;
my $p0 = exp($l[0] + $l[1] + $l[2]) + exp($l[5] + $l[6] + $l[7]);
my $p0_0 = exp($l[0] + $l[1] + $l[2]) / $p0;
my $p0_1 = exp($l[5] + $l[6] + $l[7]) / $p0;
my $p1 = exp($l[6] + $l[8] + $l[9]) + exp($l[1] + $l[3] + $l[4]);
my $p1_0 = exp($l[1] + $l[3] + $l[4]) / $p1;
my $p1_1 = exp($l[6] + $l[8] + $l[9]) / $p1;
$p1_f = [
    2 * $p0_0,
    2 * $p0_0 + 3 * $p1_0,
    2 * $p0_0,
    3 * $p1_0,
    3 * $p1_0,
    2 * $p0_1,
    2 * $p0_1 + 3 * $p1_1,
    2 * $p0_1,
    3 * $p1_1,
    3 * $p1_1
];
delta_ok
[
    $lambda,
    $d_lambda
],
[
    [
        $l[0] + (1.0 / 3) * log(2 / $p1_f->[0]),
	$l[1] + (1.0 / 3) * log(2 / $p1_f->[1]),
	$l[2] + (1.0 / 3) * log(2 / $p1_f->[2]),
	$l[3] + (1.0 / 3) * log($zero / $p1_f->[3]),
	$l[4] + (1.0 / 3) * log($zero / $p1_f->[4]),
	$l[5] + (1.0 / 3) * log($zero / $p1_f->[5]),
	$l[6] + (1.0 / 3) * log(3 / $p1_f->[6]),
	$l[7] + (1.0 / 3) * log($zero / $p1_f->[7]),
	$l[8] + (1.0 / 3) * log(3 / $p1_f->[8]),
	$l[9] + (1.0 / 3) * log(3 / $p1_f->[9])
    ],
    [
        (1.0 / 3) * log(2 / $p1_f->[0]),
	(1.0 / 3) * log(2 / $p1_f->[1]),
	(1.0 / 3) * log(2 / $p1_f->[2]),
	(1.0 / 3) * log($zero / $p1_f->[3]),
	(1.0 / 3) * log($zero / $p1_f->[4]),
	(1.0 / 3) * log($zero / $p1_f->[5]),
	(1.0 / 3) * log(3 / $p1_f->[6]),
	(1.0 / 3) * log($zero / $p1_f->[7]),
	(1.0 / 3) * log(3 / $p1_f->[8]),
	(1.0 / 3) * log(3 / $p1_f->[9])
    ]
],
$__;

 view all matches for this distribution
 view release on metacpan -  search on metacpan

( run in 0.452 second using v1.00-cache-2.02-grep-82fe00e-cpan-2c419f77a38b )