php 计算正态分布概率

tag5nh1u  于 2022-12-02  发布在  PHP
关注(0)|答案(2)|浏览(174)

我需要使用这个表来获得给定z值的概率:
https://statistics.laerd.com/statistical-guides/img/normal-table-large.png
我相信应该有一个更好的方法来得到这些值在php上,但不知道如何计算他们。任何帮助将是非常感谢。

icnyk63a

icnyk63a1#

我相信,表是normal distribution的CDF。我用error function近似的表达式编码它。
代码未经测试!

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());
}
9ceoxa92

9ceoxa922#

标准正态分布的累积分布函数与精度计算:

function cumulativeNormalDensity($x, $mean = 0, $stddev = 1, $precision = 48) {
  $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);
}

相关问题