PHP 怎么PMF 寻找

wen PHP项目 1

本文目录导读:

PHP 怎么PMF 寻找

  1. 逆变换采样(Inverse Transform Sampling)
  2. 最大似然估计(MLE)寻找参数
  3. 给定概率阈值寻找支持集
  4. 精确寻找某个概率对应的 X(如果存在)
  5. 通用 PMF 工具类(完整示例)
  6. 特殊分布(二项、几何等)
  7. 🎯 根据你的需求选择方法

在 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)

如果你有具体的分布类型或数学问题,请补充细节,我可以给出更针对性的实现!

抱歉,评论功能暂时关闭!