擅长:python、mysql、java
<p>函数ppf是y=(1+erf(x/sqrt(2))/2的逆函数。所以我们需要解这个方程,给定y在0和1之间。下面是一个由<a href="https://en.wikipedia.org/wiki/Bisection_method" rel="nofollow noreferrer">bisection method</a>执行此操作的代码。我导入了SciPy函数来说明结果是一样的。在</p>
<pre><code>from math import erf, sqrt
from scipy.stats import norm # only for comparison
y = 0.123
z = 2*y-1
a = 0
while erf(a) > z or erf(a+1) < z: # looking for initial bracket of size 1
if erf(a) > z:
a -= 1
else:
a += 1
b = a+1 # found a bracket, proceed to refine it
while b-a > 1e-15: # 1e-15 ought to be enough precision
c = (a+b)/2.0 # bisection method
if erf(c) > z:
b = c
else:
a = c
print sqrt(2)*(a+b)/2.0 # this is the answer
print norm.ppf(y) # SciPy for comparison
</code></pre>
<p>留给你去做:</p>
<ul>
<li>初步绑定检查(y必须介于0和1之间)</li>
<li>如果需要其他均值/方差,则进行缩放和移位;代码用于标准正态分布(均值0,方差1)。在</li>
</ul>