aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/statistics.py
diff options
context:
space:
mode:
authorRaymond Hettinger <rhettinger@users.noreply.github.com>2024-06-01 10:49:14 -0500
committerGitHub <noreply@github.com>2024-06-01 10:49:14 -0500
commitce2ea7d629788fd051cbec099b5947ecbe50e819 (patch)
tree9ec693298bbbcee98c4361ccdb07dcbbcbad9d43 /Lib/statistics.py
parent90ec19fd33e2452902b9788d4821f1fbf6542304 (diff)
downloadcpython-ce2ea7d629788fd051cbec099b5947ecbe50e819.tar.gz
cpython-ce2ea7d629788fd051cbec099b5947ecbe50e819.zip
Minor speed/accuracy improvement for kde() (gh-119910)
Diffstat (limited to 'Lib/statistics.py')
-rw-r--r--Lib/statistics.py17
1 files changed, 9 insertions, 8 deletions
diff --git a/Lib/statistics.py b/Lib/statistics.py
index 450edfaabe8..c36145fe7f2 100644
--- a/Lib/statistics.py
+++ b/Lib/statistics.py
@@ -953,12 +953,14 @@ def kde(data, h, kernel='normal', *, cumulative=False):
case 'quartic' | 'biweight':
K = lambda t: 15/16 * (1.0 - t * t) ** 2
- W = lambda t: 3/16 * t**5 - 5/8 * t**3 + 15/16 * t + 1/2
+ W = lambda t: sumprod((3/16, -5/8, 15/16, 1/2),
+ (t**5, t**3, t, 1.0))
support = 1.0
case 'triweight':
K = lambda t: 35/32 * (1.0 - t * t) ** 3
- W = lambda t: 35/32 * (-1/7*t**7 + 3/5*t**5 - t**3 + t) + 1/2
+ W = lambda t: sumprod((-5/32, 21/32, -35/32, 35/32, 1/2),
+ (t**7, t**5, t**3, t, 1.0))
support = 1.0
case 'cosine':
@@ -974,12 +976,10 @@ def kde(data, h, kernel='normal', *, cumulative=False):
if support is None:
def pdf(x):
- n = len(data)
- return sum(K((x - x_i) / h) for x_i in data) / (n * h)
+ return sum(K((x - x_i) / h) for x_i in data) / (len(data) * h)
def cdf(x):
- n = len(data)
- return sum(W((x - x_i) / h) for x_i in data) / n
+ return sum(W((x - x_i) / h) for x_i in data) / len(data)
else:
@@ -1732,7 +1732,7 @@ def _quartic_invcdf_estimate(p):
_quartic_invcdf = _newton_raphson(
f_inv_estimate = _quartic_invcdf_estimate,
- f = lambda t: 3/16 * t**5 - 5/8 * t**3 + 15/16 * t + 1/2,
+ f = lambda t: sumprod((3/16, -5/8, 15/16, 1/2), (t**5, t**3, t, 1.0)),
f_prime = lambda t: 15/16 * (1.0 - t * t) ** 2)
def _triweight_invcdf_estimate(p):
@@ -1742,7 +1742,8 @@ def _triweight_invcdf_estimate(p):
_triweight_invcdf = _newton_raphson(
f_inv_estimate = _triweight_invcdf_estimate,
- f = lambda t: 35/32 * (-1/7*t**7 + 3/5*t**5 - t**3 + t) + 1/2,
+ f = lambda t: sumprod((-5/32, 21/32, -35/32, 35/32, 1/2),
+ (t**7, t**5, t**3, t, 1.0)),
f_prime = lambda t: 35/32 * (1.0 - t * t) ** 3)
_kernel_invcdfs = {