php-ml/src/Math/Statistic/StandardDeviation.php

42 lines
819 B
PHP
Raw Normal View History

<?php
2016-04-27 21:28:01 +00:00
2016-11-20 21:53:17 +00:00
declare(strict_types=1);
namespace Phpml\Math\Statistic;
use Phpml\Exception\InvalidArgumentException;
class StandardDeviation
{
/**
* @param array|float[] $a
*
* @throws InvalidArgumentException
*/
public static function population(array $a, bool $sample = true): float
{
2016-04-27 21:28:01 +00:00
if (empty($a)) {
throw InvalidArgumentException::arrayCantBeEmpty();
}
2016-04-27 21:28:01 +00:00
$n = count($a);
if ($sample && $n === 1) {
throw InvalidArgumentException::arraySizeToSmall(2);
}
2016-04-27 21:28:01 +00:00
2016-04-27 21:57:05 +00:00
$mean = Mean::arithmetic($a);
$carry = 0.0;
foreach ($a as $val) {
$d = $val - $mean;
$carry += $d * $d;
2016-11-20 21:53:17 +00:00
}
2016-04-27 21:28:01 +00:00
if ($sample) {
--$n;
}
2016-05-02 21:36:58 +00:00
return sqrt((float) ($carry / $n));
}
}