123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- namespace MathPHP\Tests\Probability\Distribution\Discrete;
- use MathPHP\Probability\Distribution\Discrete\Bernoulli;
- use MathPHP\Probability\Distribution\Discrete\Binomial;
- class BernoulliTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * @test pmf
- * @dataProvider dataProviderForPMF
- * @param int $k
- * @param float $p
- * @param float $expectedPmf
- */
- public function testPmf(int $k, float $p, float $expectedPmf)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $pmf = $bernoulli->pmf($k);
- // Then
- $this->assertEqualsWithDelta($expectedPmf, $pmf, 0.000001);
- }
- /**
- * @return array
- */
- public function dataProviderForPMF(): array
- {
- return [
- [0, 0.6, 0.4],
- [1, 0.6, 0.6],
- [0, 0.3, 0.7],
- [1, 0.3, 0.3],
- ];
- }
- /**
- * @test pmf is same as Binomial with n = 1
- * @dataProvider dataProviderForMean
- * @param float $p
- */
- public function testPmfIsBinomialWithNEqualsOne(float $p)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- $binomial = new Binomial(1, $p);
- // Then
- $this->assertEquals($binomial->pmf(0), $bernoulli->pmf(0));
- $this->assertEquals($binomial->pmf(1), $bernoulli->pmf(1));
- }
- /**
- * @test cdf
- * @dataProvider dataProviderForCDF
- * @param int $k
- * @param float $p
- * @param float $expectedCdf
- */
- public function testCdf(int $k, float $p, $expectedCdf)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $cdf = $bernoulli->cdf($k);
- // Then
- $this->assertEqualsWithDelta($expectedCdf, $cdf, 0.000001);
- }
- /**
- * @return array
- */
- public function dataProviderForCDF(): array
- {
- return [
- [0, 0.6, 0.4],
- [1, 0.6, 1],
- [0, 0.3, 0.7],
- [1, 0.3, 1],
- [-1, 0.5, 0],
- ];
- }
- /**
- * @test mean
- * @dataProvider dataProviderForMean
- * @param float $p
- * @param float $μ
- */
- public function testMean(float $p, float $μ)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $mean = $bernoulli->mean();
- // Then
- $this->assertEquals($μ, $mean);
- }
- /**
- * @return array [p, mean]
- */
- public function dataProviderForMean(): array
- {
- return [
- [0.00001, 0.00001, 0, 0],
- [0.1, 0.1, 0, 0],
- [0.2, 0.2, 0, 0],
- [0.3, 0.3, 0, 0],
- [0.4, 0.4, 0, 0],
- [0.5, 0.5, 0.5, 0],
- [0.6, 0.6, 1, 1],
- [0.7, 0.7, 1, 1],
- [0.8, 0.8, 1, 1],
- [0.9, 0.9, 1, 1],
- [0.9999, 0.9999, 1, 1],
- ];
- }
- /**
- * @test median
- * @dataProvider dataProviderForMedian
- * @param float $p
- * @param float $expected
- */
- public function testMedian(float $p, float $expected)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $median = $bernoulli->median();
- // Then
- $this->assertEquals($expected, $median);
- }
- /**
- * @return array [p, median]
- */
- public function dataProviderForMedian(): array
- {
- return [
- [0.00001, 0],
- [0.1, 0],
- [0.2, 0],
- [0.3, 0],
- [0.4, 0],
- [0.5, 0.5],
- [0.6, 1],
- [0.7, 1],
- [0.8, 1],
- [0.9, 1],
- [0.9999, 1],
- ];
- }
- /**
- * @test mode
- * @dataProvider dataProviderForMode
- * @param float $p
- * @param float[] $expected
- */
- public function testMode(float $p, array $expected)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $mode = $bernoulli->mode();
- // Then
- $this->assertEquals($expected, $mode);
- }
- /**
- * @return array [p, mode]
- */
- public function dataProviderForMode(): array
- {
- return [
- [0.00001, [0]],
- [0.1, [0]],
- [0.2, [0]],
- [0.3, [0]],
- [0.4, [0]],
- [0.5, [0, 1]],
- [0.6, [1]],
- [0.7, [1]],
- [0.8, [1]],
- [0.9, [1]],
- [0.9999, [1]],
- ];
- }
- /**
- * @test variance
- * @dataProvider dataProviderForVariance
- * @param float $p
- * @param float $σ²
- */
- public function testVariance(float $p, float $σ²)
- {
- // Given
- $bernoulli = new Bernoulli($p);
- // When
- $variance = $bernoulli->variance();
- // Then
- $this->assertEqualsWithDelta($σ², $variance, 0.00001);
- }
- /**
- * @return array [p, variance]
- */
- public function dataProviderForVariance(): array
- {
- return [
- [0.1, 0.09],
- [0.3, 0.21],
- [0.5, 0.25],
- [0.7, 0.21],
- [0.9, 0.09],
- ];
- }
- }
|