]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Improve accuracy of kde() invcdf estimates (gh-124637)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Fri, 27 Sep 2024 16:56:37 +0000 (09:56 -0700)
committerGitHub <noreply@github.com>
Fri, 27 Sep 2024 16:56:37 +0000 (09:56 -0700)
Lib/statistics.py

index d3dd0d530c31cfb267a2cfd7d19615026027dc07..f193fcdc241aa9c97036057f9a9628ea8c81a3c0 100644 (file)
@@ -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')