mirror of https://github.com/python/cpython
Improve accuracy of kde() invcdf estimates (gh-124637)
This commit is contained in:
parent
26a74203f0
commit
4b89c5ebfc
|
@ -870,9 +870,12 @@ def _newton_raphson(f_inv_estimate, f, f_prime, tolerance=1e-12):
|
|||
return f_inv
|
||||
|
||||
def _quartic_invcdf_estimate(p):
|
||||
# A handrolled piecewise approximation. There is no magic here.
|
||||
sign, p = (1.0, p) if p <= 1/2 else (-1.0, 1.0 - p)
|
||||
if p < 0.0106:
|
||||
return ((2.0 * p) ** 0.3838 - 1.0) * sign
|
||||
x = (2.0 * p) ** 0.4258865685331 - 1.0
|
||||
if p >= 0.004 < 0.499:
|
||||
if p < 0.499:
|
||||
x += 0.026818732 * sin(7.101753784 * p + 2.73230839482953)
|
||||
return x * sign
|
||||
|
||||
|
@ -886,8 +889,11 @@ def quartic_kernel():
|
|||
return pdf, cdf, invcdf, support
|
||||
|
||||
def _triweight_invcdf_estimate(p):
|
||||
# A handrolled piecewise approximation. There is no magic here.
|
||||
sign, p = (1.0, p) if p <= 1/2 else (-1.0, 1.0 - p)
|
||||
x = (2.0 * p) ** 0.3400218741872791 - 1.0
|
||||
if 0.00001 < p < 0.499:
|
||||
x -= 0.033 * sin(1.07 * tau * (p - 0.035))
|
||||
return x * sign
|
||||
|
||||
@register('triweight')
|
||||
|
|
Loading…
Reference in New Issue