LOESSTest.php 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace MathPHP\Tests\Statistics\Regression;
  3. use MathPHP\Statistics\Regression\LOESS;
  4. use MathPHP\Exception;
  5. class LOESSTest extends \PHPUnit\Framework\TestCase
  6. {
  7. /**
  8. * @test evaluate
  9. * @dataProvider dataProviderForEvaluate
  10. * @param array $points
  11. * @param float $α
  12. * @param float $λ
  13. * @param array $yHat
  14. * @throws \Exception
  15. */
  16. public function testEvaluate(array $points, float $α, float $λ, array $yHat)
  17. {
  18. // Given
  19. $loess = new LOESS($points, $α, $λ);
  20. // When
  21. $test_yHat = $loess->yHat();
  22. // Then
  23. foreach ($test_yHat as $key => $value) {
  24. $this->assertEqualsWithDelta($yHat[$key], $value, .0000001);
  25. }
  26. }
  27. /**
  28. * @return array [points, α, λ, yHat]
  29. */
  30. public function dataProviderForEvaluate(): array
  31. {
  32. // data from http://www.itl.nist.gov/div898/handbook/pmd/section1/dep/dep144.htm
  33. return [
  34. [
  35. [ [0.5578196, 18.63654], [2.0217271, 103.49646], [2.5773252, 150.35391], [3.4140288, 190.51031], [4.3014084, 208.70115], [4.7448394, 213.71135], [5.1073781, 228.49353], [6.5411662, 233.55387], [6.7216176, 234.55054], [7.2600583, 223.89225], [8.1335874, 227.68339], [9.1224379, 223.91982], [11.9296663, 168.01999], [12.3797674, 164.9575], [13.2728619, 152.61107], [14.2767453, 160.78742], [15.3731026, 168.55567], [15.6476637, 152.42658], [18.5605355, 221.70702], [18.5866354, 222.6904], [18.7572812, 243.18828] ],
  36. 1 / 3,
  37. 1,
  38. [20.5930233664173, 107.160307187003, 139.767381190249, 174.263043459836, 207.233382548945, 216.661586014446, 220.544479834053, 229.860693009198, 229.834712999942, 229.430115826698, 226.604459037782, 220.390409885032, 172.347999406849, 163.841661310125, 161.848970688604, 160.335083688228, 160.191989312566, 161.055592538928, 227.339955872967, 227.898534977536, 231.558556343728],
  39. ],
  40. ];
  41. }
  42. /**
  43. * @test smoothness parameter OutOfBoundsException
  44. * @dataProvider dataProviderForSmoothnessParameterOutOfBoundsException
  45. * @param array $points
  46. * @param float $α
  47. * @param float $λ
  48. * @throws \Exception
  49. */
  50. public function testSmoothnessParameterOutOfBoundsException(array $points, float $α, float $λ)
  51. {
  52. // Then
  53. $this->expectException(Exception\OutOfBoundsException::class);
  54. // When
  55. $loess = new LOESS($points, $α, $λ);
  56. }
  57. /**
  58. * @return array [points, α, λ]
  59. */
  60. public function dataProviderForSmoothnessParameterOutOfBoundsException(): array
  61. {
  62. return [
  63. [
  64. [ [0.5578196, 18.63654], [2.0217271, 103.49646], [2.5773252, 150.35391], [3.4140288, 190.51031], [4.3014084, 208.70115], [4.7448394, 213.71135], [5.1073781, 228.49353], [6.5411662, 233.55387], [6.7216176, 234.55054], [7.2600583, 223.89225], [8.1335874, 227.68339], [9.1224379, 223.91982], [11.9296663, 168.01999], [12.3797674, 164.9575], [13.2728619, 152.61107], [14.2767453, 160.78742], [15.3731026, 168.55567], [15.6476637, 152.42658], [18.5605355, 221.70702], [18.5866354, 222.6904], [18.7572812, 243.18828] ],
  65. -50, 1
  66. ],
  67. [
  68. [ [0.5578196, 18.63654], [2.0217271, 103.49646], [2.5773252, 150.35391], [3.4140288, 190.51031], [4.3014084, 208.70115], [4.7448394, 213.71135], [5.1073781, 228.49353], [6.5411662, 233.55387], [6.7216176, 234.55054], [7.2600583, 223.89225], [8.1335874, 227.68339], [9.1224379, 223.91982], [11.9296663, 168.01999], [12.3797674, 164.9575], [13.2728619, 152.61107], [14.2767453, 160.78742], [15.3731026, 168.55567], [15.6476637, 152.42658], [18.5605355, 221.70702], [18.5866354, 222.6904], [18.7572812, 243.18828] ],
  69. 1.1, 1
  70. ],
  71. [
  72. [ [0.5578196, 18.63654], [2.0217271, 103.49646], [2.5773252, 150.35391], [3.4140288, 190.51031], [4.3014084, 208.70115], [4.7448394, 213.71135], [5.1073781, 228.49353], [6.5411662, 233.55387], [6.7216176, 234.55054], [7.2600583, 223.89225], [8.1335874, 227.68339], [9.1224379, 223.91982], [11.9296663, 168.01999], [12.3797674, 164.9575], [13.2728619, 152.61107], [14.2767453, 160.78742], [15.3731026, 168.55567], [15.6476637, 152.42658], [18.5605355, 221.70702], [18.5866354, 222.6904], [18.7572812, 243.18828] ],
  73. 3, 1
  74. ],
  75. ];
  76. }
  77. }