public static function PMF(array $frequencies, array $probabilities) : float
{
// Must have a probability for each frequency
if (count($frequencies) !== count($probabilities)) {
throw new Exception\BadDataException('Number of frequencies does not match number of probabilities.');
}
// Probabilities must add up to 1
if (round(array_sum($probabilities), 1) != 1) {
throw new Exception\BadDataException('Probabilities do not add up to 1.');
}
$n = array_sum($frequencies);
$n! = Combinatorics::factorial($n);
$x₁!⋯xk! = array_product(array_map('MathPHP\\Probability\\Combinatorics::factorial', $frequencies));
$p₁ˣ¹⋯pkˣᵏ = array_product(array_map(function ($x, $p) {
return $p ** $x;
}, $frequencies, $probabilities));
return $n! / $x₁!⋯xk! * $p₁ˣ¹⋯pkˣᵏ;
}