本文目录导读:

- 逆变换采样(Inverse Transform Sampling)
- 最大似然估计(MLE)寻找参数
- 给定概率阈值寻找支持集
- 精确寻找某个概率对应的 X(如果存在)
- 通用 PMF 工具类(完整示例)
- 特殊分布(二项、几何等)
- 🎯 根据你的需求选择方法
在 PHP 中实现 PMF(概率质量函数)寻找,通常指的是在已知概率分布的情况下,找出某个概率值对应的随机变量值,或者在给定约束下找到最可能的参数,由于 PMF 本身是离散的,这里提供几种常见的实现方式:
逆变换采样(Inverse Transform Sampling)
给定 PMF ( P(X = x_i) = p_i ),通过均匀分布 U(0,1) 反推 X 的值。
function pmfInverseSampling(array $values, array $probabilities, float $u): mixed
{
// 概率归一化
$sum = array_sum($probabilities);
$probabilities = array_map(fn($p) => $p / $sum, $probabilities);
$cumulative = 0;
foreach ($values as $i => $value) {
$cumulative += $probabilities[$i];
if ($u <= $cumulative) {
return $value;
}
}
return end($values); // 防止浮点误差
}
// 示例:泊松分布 PMF (λ=3)
$poisson = [];
$values = range(0, 10);
foreach ($values as $k) {
$poisson[$k] = exp(-3) * pow(3, $k) / factorial($k);
}
$randomValue = pmfInverseSampling(array_keys($poisson), array_values($poisson), mt_rand() / mt_getrandmax());
最大似然估计(MLE)寻找参数
当需要从观测数据中“寻找” PMF 的参数时,用优化方法:
function fitPoissonMLE(array $observations): float
{
return array_sum($observations) / count($observations); // 泊松的 MLE 就是均值
}
// 更复杂的分布则需要数值优化(如梯度下降)
给定概率阈值寻找支持集
找出 PMF 中概率大于某阈值的所有值:
function findSupportAboveThreshold(array $pmf, float $threshold): array
{
$result = [];
foreach ($pmf as $value => $prob) {
if ($prob > $threshold) {
$result[$value] = $prob;
}
}
arsort($result);
return $result;
}
精确寻找某个概率对应的 X(如果存在)
反查 PMF(注意可能不唯一,且浮点数比较需容差):
function findXForProbability(array $pmf, float $targetProb, float $epsilon = 1e-9): array
{
$matches = [];
foreach ($pmf as $x => $prob) {
if (abs($prob - $targetProb) < $epsilon) {
$matches[] = $x;
}
}
return $matches;
}
通用 PMF 工具类(完整示例)
class DiscreteDistribution
{
private array $pmf;
private array $cdf;
public function __construct(array $pmf)
{
$this->pmf = $pmf;
$this->normalize();
$this->buildCdf();
}
private function normalize(): void
{
$sum = array_sum($this->pmf);
$this->pmf = array_map(fn($p) => $p / $sum, $this->pmf);
}
private function buildCdf(): void
{
$cumulative = 0;
foreach ($this->pmf as $x => $p) {
$cumulative += $p;
$this->cdf[$x] = $cumulative;
}
}
public function inverseCdf(float $q): mixed
{
foreach ($this->cdf as $x => $cdfValue) {
if ($q <= $cdfValue) return $x;
}
return array_key_last($this->pmf);
}
public function sample(): mixed
{
return $this->inverseCdf(mt_rand() / mt_getrandmax());
}
public function getPmf(): array { return $this->pmf; }
}
// 使用
$dist = new DiscreteDistribution([
0 => 0.1, 1 => 0.3, 2 => 0.4, 3 => 0.2
]);
$sample = $dist->sample();
特殊分布(二项、几何等)
PHP 原生不支持概率分布,但可以用组合数学实现:
function binomialPmf(int $n, float $p, int $k): float
{
$comb = factorial($n) / (factorial($k) * factorial($n - $k));
return $comb * pow($p, $k) * pow(1 - $p, $n - $k);
}
🎯 根据你的需求选择方法
- 已知分布随机产生样本 → 逆变换采样(方法1)
- 从数据估计参数 → MLE(方法2)
- 查找高概率区域 → 支持集过滤(方法3)
- 反查概率对应值 → 精确匹配(方法4)
如果你有具体的分布类型或数学问题,请补充细节,我可以给出更针对性的实现!