本文目录导读:

- 逆变换采样(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)
如果你有具体的分布类型或数学问题,请补充细节,我可以给出更针对性的实现!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播