我读过,使用statsmodels.nonparametric.kde
模块而不是scipy.stats.gaussian_kde可能会导致实质性speed increase。
我有一个简单的代码块(4行代码),我目前使用scipy.stats.gaussian_kde
进行计算,我想在statsmodels
中替换它的等效代码,看看我是否可以实际上是在提高速度。
这是MWE:
import numpy as np
from scipy import stats
# Generate random two-dimensional data.
def measure(n):
m1 = np.random.normal(size=n)
m2 = np.random.normal(scale=0.5, size=n)
return m1+m2, m1-m2
m1, m2 = measure(20000)
# Define data limits.
xmin, xmax = m1.min(), m1.max()
ymin, ymax = m2.min(), m2.max()
# Format data correctly.
values = np.vstack([m1, m2])
# Define a certain point value.
x1, y1 = 0.5, 0.5
##############
# Replace with calls to statsmodels.nonparametric.kde from here on.
# 1- Perform a kernel density estimate on the data.
kernel = stats.gaussian_kde(values)
# 2- Get kernel value for the point.
iso = kernel((x1,y1))
# 3- Take a random sample from KDE distribution.
sample = kernel.resample(size=1000)
# 4- Filter the sample to keep only values for which
# the kernel evaluates to less than what it does in the
# point (x1,y1). This is the most important step to be replaced.
insample = kernel(sample) < iso
可以看出,只有4行代码需要替换。不幸的是statsmodels.nonparametric.kde
的文档有点差,我无法弄清楚如何进行这样的替换。
最后一行是最重要的一行,因为它在这里花费了大部分计算时间(如此处Speed up sampling of kernel estimate所述)。