Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   1  <?php
   2  
   3  declare(strict_types=1);
   4  
   5  namespace Phpml\Metric;
   6  
   7  use Phpml\Exception\InvalidArgumentException;
   8  use Phpml\Math\Statistic\Correlation;
   9  use Phpml\Math\Statistic\Mean;
  10  
  11  final class Regression
  12  {
  13      public static function meanSquaredError(array $targets, array $predictions): float
  14      {
  15          self::assertCountEquals($targets, $predictions);
  16  
  17          $errors = [];
  18          foreach ($targets as $index => $target) {
  19              $errors[] = (($target - $predictions[$index]) ** 2);
  20          }
  21  
  22          return Mean::arithmetic($errors);
  23      }
  24  
  25      public static function meanSquaredLogarithmicError(array $targets, array $predictions): float
  26      {
  27          self::assertCountEquals($targets, $predictions);
  28  
  29          $errors = [];
  30          foreach ($targets as $index => $target) {
  31              $errors[] = log((1 + $target) / (1 + $predictions[$index])) ** 2;
  32          }
  33  
  34          return Mean::arithmetic($errors);
  35      }
  36  
  37      public static function meanAbsoluteError(array $targets, array $predictions): float
  38      {
  39          self::assertCountEquals($targets, $predictions);
  40  
  41          $errors = [];
  42          foreach ($targets as $index => $target) {
  43              $errors[] = abs($target - $predictions[$index]);
  44          }
  45  
  46          return Mean::arithmetic($errors);
  47      }
  48  
  49      public static function medianAbsoluteError(array $targets, array $predictions): float
  50      {
  51          self::assertCountEquals($targets, $predictions);
  52  
  53          $errors = [];
  54          foreach ($targets as $index => $target) {
  55              $errors[] = abs($target - $predictions[$index]);
  56          }
  57  
  58          return (float) Mean::median($errors);
  59      }
  60  
  61      public static function r2Score(array $targets, array $predictions): float
  62      {
  63          self::assertCountEquals($targets, $predictions);
  64  
  65          return Correlation::pearson($targets, $predictions) ** 2;
  66      }
  67  
  68      public static function maxError(array $targets, array $predictions): float
  69      {
  70          self::assertCountEquals($targets, $predictions);
  71  
  72          $errors = [];
  73          foreach ($targets as $index => $target) {
  74              $errors[] = abs($target - $predictions[$index]);
  75          }
  76  
  77          return (float) max($errors);
  78      }
  79  
  80      private static function assertCountEquals(array &$targets, array &$predictions): void
  81      {
  82          if (count($targets) !== count($predictions)) {
  83              throw new InvalidArgumentException('Targets count must be equal with predictions count');
  84          }
  85      }
  86  }