在php中计算正态分布概率

问题描述 投票:0回答:2

我需要使用此表来获取给定 z 值的概率:

https://statistics.laerd.com/statistical-guides/img/normal-table-large.png

我确信应该有更好的方法来在 php 上获取这些值,但不知道如何计算它们。 任何帮助将不胜感激。

php probability distribution normal-distribution
2个回答
4
投票

可以通过使用泰勒级数近似找到标准正态分布 CDF(累积分布函数)的快速近似:

所以,这是我的 CDF 的 PHP 实现:

function cumulativeNormalDensity($x, $mean = 0, $stddev = 1, $precision = 256) {
  $result = 0;
  $x -= $mean;
  $x /= $stddev;
  for ($i = 0, $k = 1; $i < $precision; $i++) {
    $n = $i * 2 + 1;
    $k *= $n;
    $p = pow($x, $n) / $k;
    if (is_nan($p) || is_infinite($p)) break;
    $result += $p;
  }
  $result *= 1 / sqrt(2 * pi()) * exp(-pow($x, 2) / 2);
  $result += 0.5;
  return max(0, $result);
}

2
投票
我相信,

表格是正态分布的CDF。我使用表达式对其进行编码 误差函数近似值。

代码未经测试!

function sgn( $x ) {
  if ( $x < 0 )
    return -1;
  return 1;
}

function erf( $x ) {
  $e  = exp(-$x*$x);
  $e2 = exp(-$x*$x*2);

  $q = sqrt(pi())/2 + 31*$e/200 - 341*$e2/8000;

  return 2*sgn($x)*sqrt(1-$e)*$q/sqrt(pi());
}

function CDF( $x ) {
    return (1 + erf($x / sqrt(2))) / 2;
}

print_r(CDF(0));
print_r(CDF(0.1));
....    

更新

这里是计算 erf() 的快速(未经测试!)代码,最多包含 4 个项

function erf( $x ) {
  $e = exp(-$x*$x);
  $t = 1.0 - $e;

  $s = 1. + $t*(-1./12. + $t*(-7./480. + $t*( -5./896. +$t * (-787./276480.))));

  return 2.*sgn($x)*sqrt($t)*$s/sqrt(pi());
}
© www.soinside.com 2019 - 2024. All rights reserved.