public static function generalizedMean(array $numbers, $p)
{
// Special cases for infinite p
if ($p == -\INF) {
return min($numbers);
}
if ($p == \INF) {
return max($numbers);
}
// Special case for p = 0 (geometric mean)
if ($p == 0) {
return self::geometricMean($numbers);
}
// Standard case for non-infinite p
$n = count($numbers);
$∑xᵢᵖ = array_sum(array_map(function ($x) use($p) {
return $x ** $p;
}, $numbers));
return pow(1 / $n * $∑xᵢᵖ, 1 / $p);
}