使用statsmodels.nonparametric.kde而不是scipy.stats.gaussian_kde

时间:2014-01-07 17:39:56

标签: python scipy statsmodels

我读过,使用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所述)。

0 个答案:

没有答案