BernoulliTest.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <?php
  2. namespace MathPHP\Tests\Probability\Distribution\Discrete;
  3. use MathPHP\Probability\Distribution\Discrete\Bernoulli;
  4. use MathPHP\Probability\Distribution\Discrete\Binomial;
  5. class BernoulliTest extends \PHPUnit\Framework\TestCase
  6. {
  7. /**
  8. * @test pmf
  9. * @dataProvider dataProviderForPMF
  10. * @param int $k
  11. * @param float $p
  12. * @param float $expectedPmf
  13. */
  14. public function testPmf(int $k, float $p, float $expectedPmf)
  15. {
  16. // Given
  17. $bernoulli = new Bernoulli($p);
  18. // When
  19. $pmf = $bernoulli->pmf($k);
  20. // Then
  21. $this->assertEqualsWithDelta($expectedPmf, $pmf, 0.000001);
  22. }
  23. /**
  24. * @return array
  25. */
  26. public function dataProviderForPMF(): array
  27. {
  28. return [
  29. [0, 0.6, 0.4],
  30. [1, 0.6, 0.6],
  31. [0, 0.3, 0.7],
  32. [1, 0.3, 0.3],
  33. ];
  34. }
  35. /**
  36. * @test pmf is same as Binomial with n = 1
  37. * @dataProvider dataProviderForMean
  38. * @param float $p
  39. */
  40. public function testPmfIsBinomialWithNEqualsOne(float $p)
  41. {
  42. // Given
  43. $bernoulli = new Bernoulli($p);
  44. $binomial = new Binomial(1, $p);
  45. // Then
  46. $this->assertEquals($binomial->pmf(0), $bernoulli->pmf(0));
  47. $this->assertEquals($binomial->pmf(1), $bernoulli->pmf(1));
  48. }
  49. /**
  50. * @test cdf
  51. * @dataProvider dataProviderForCDF
  52. * @param int $k
  53. * @param float $p
  54. * @param float $expectedCdf
  55. */
  56. public function testCdf(int $k, float $p, $expectedCdf)
  57. {
  58. // Given
  59. $bernoulli = new Bernoulli($p);
  60. // When
  61. $cdf = $bernoulli->cdf($k);
  62. // Then
  63. $this->assertEqualsWithDelta($expectedCdf, $cdf, 0.000001);
  64. }
  65. /**
  66. * @return array
  67. */
  68. public function dataProviderForCDF(): array
  69. {
  70. return [
  71. [0, 0.6, 0.4],
  72. [1, 0.6, 1],
  73. [0, 0.3, 0.7],
  74. [1, 0.3, 1],
  75. [-1, 0.5, 0],
  76. ];
  77. }
  78. /**
  79. * @test mean
  80. * @dataProvider dataProviderForMean
  81. * @param float $p
  82. * @param float $μ
  83. */
  84. public function testMean(float $p, float $μ)
  85. {
  86. // Given
  87. $bernoulli = new Bernoulli($p);
  88. // When
  89. $mean = $bernoulli->mean();
  90. // Then
  91. $this->assertEquals($μ, $mean);
  92. }
  93. /**
  94. * @return array [p, mean]
  95. */
  96. public function dataProviderForMean(): array
  97. {
  98. return [
  99. [0.00001, 0.00001, 0, 0],
  100. [0.1, 0.1, 0, 0],
  101. [0.2, 0.2, 0, 0],
  102. [0.3, 0.3, 0, 0],
  103. [0.4, 0.4, 0, 0],
  104. [0.5, 0.5, 0.5, 0],
  105. [0.6, 0.6, 1, 1],
  106. [0.7, 0.7, 1, 1],
  107. [0.8, 0.8, 1, 1],
  108. [0.9, 0.9, 1, 1],
  109. [0.9999, 0.9999, 1, 1],
  110. ];
  111. }
  112. /**
  113. * @test median
  114. * @dataProvider dataProviderForMedian
  115. * @param float $p
  116. * @param float $expected
  117. */
  118. public function testMedian(float $p, float $expected)
  119. {
  120. // Given
  121. $bernoulli = new Bernoulli($p);
  122. // When
  123. $median = $bernoulli->median();
  124. // Then
  125. $this->assertEquals($expected, $median);
  126. }
  127. /**
  128. * @return array [p, median]
  129. */
  130. public function dataProviderForMedian(): array
  131. {
  132. return [
  133. [0.00001, 0],
  134. [0.1, 0],
  135. [0.2, 0],
  136. [0.3, 0],
  137. [0.4, 0],
  138. [0.5, 0.5],
  139. [0.6, 1],
  140. [0.7, 1],
  141. [0.8, 1],
  142. [0.9, 1],
  143. [0.9999, 1],
  144. ];
  145. }
  146. /**
  147. * @test mode
  148. * @dataProvider dataProviderForMode
  149. * @param float $p
  150. * @param float[] $expected
  151. */
  152. public function testMode(float $p, array $expected)
  153. {
  154. // Given
  155. $bernoulli = new Bernoulli($p);
  156. // When
  157. $mode = $bernoulli->mode();
  158. // Then
  159. $this->assertEquals($expected, $mode);
  160. }
  161. /**
  162. * @return array [p, mode]
  163. */
  164. public function dataProviderForMode(): array
  165. {
  166. return [
  167. [0.00001, [0]],
  168. [0.1, [0]],
  169. [0.2, [0]],
  170. [0.3, [0]],
  171. [0.4, [0]],
  172. [0.5, [0, 1]],
  173. [0.6, [1]],
  174. [0.7, [1]],
  175. [0.8, [1]],
  176. [0.9, [1]],
  177. [0.9999, [1]],
  178. ];
  179. }
  180. /**
  181. * @test variance
  182. * @dataProvider dataProviderForVariance
  183. * @param float $p
  184. * @param float $σ²
  185. */
  186. public function testVariance(float $p, float $σ²)
  187. {
  188. // Given
  189. $bernoulli = new Bernoulli($p);
  190. // When
  191. $variance = $bernoulli->variance();
  192. // Then
  193. $this->assertEqualsWithDelta($σ², $variance, 0.00001);
  194. }
  195. /**
  196. * @return array [p, variance]
  197. */
  198. public function dataProviderForVariance(): array
  199. {
  200. return [
  201. [0.1, 0.09],
  202. [0.3, 0.21],
  203. [0.5, 0.25],
  204. [0.7, 0.21],
  205. [0.9, 0.09],
  206. ];
  207. }
  208. }