Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用statsmodels.nonparametric.kde代替scipy.stats.gaussian_kde_Python_Scipy_Statsmodels - Fatal编程技术网

Python 使用statsmodels.nonparametric.kde代替scipy.stats.gaussian_kde

Python 使用statsmodels.nonparametric.kde代替scipy.stats.gaussian_kde,python,scipy,statsmodels,Python,Scipy,Statsmodels,我已经读到,使用statsmodels.nonparametric.kde模块而不是 我有一个简单的代码块(4行代码),我目前正在使用scipy.stats.gaussian_kde计算它,我想用这些代码块替换它在statsmodels中的等价代码块,看看我是否真的能在速度上得到提高 这是MWE: import numpy as np from scipy import stats # Generate random two-dimensional data. def measure(n):

我已经读到,使用
statsmodels.nonparametric.kde
模块而不是

我有一个简单的代码块(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
将numpy导入为np
从scipy导入统计信息
#生成随机二维数据。
def测量值(n):
m1=np.随机.正常(尺寸=n)
m2=np.随机.正常(比例=0.5,尺寸=n)
返回m1+m2,m1-m2
m1,m2=测量值(20000)
#定义数据限制。
xmin,xmax=m1.min(),m1.max()
ymin,ymax=m2.min(),m2.max()
#正确格式化数据。
值=np.vstack([m1,m2])
#定义某个点值。
x1,y1=0.5,0.5
##############
#替换为从此处起对statsmodels.nonparametric.kde的调用。
#1-对数据执行内核密度估计。
kernel=stats.gaussian_kde(值)
#2-获取点的内核值。
iso=内核((x1,y1))
#3-从KDE分布中随机抽取样本。
sample=kernel.resample(大小=1000)
#4-过滤样本以仅保留以下值:
#内核的计算结果小于它在
#点(x1,y1)。这是需要替换的最重要的步骤。
INSSAMPLE=内核(样本)
可以看出,只需要替换4行代码。不幸的是,
statsmodels.nonparametric.kde
的文档有点差,我不知道如何进行这样的替换


最后一行是最重要的一行,因为大部分计算时间都花在这里(如这里所述)。

不幸的是,statsmodels没有帮助。statsmodels中的快速fft版本仅适用于单变量KDE(目前没有重采样方法)。我想,statsmodels中的多元KDE比scipy的gaussian_KDE慢。如果你的目标是积分,那么scipy的gaussian_KDE有一个
integrate_box
方法,可能相当快(用Fortran)。但是,我从未尝试过。不幸的是,
integrate\u box
对我来说没有任何用处,因为积分区域是由那些计算结果小于
内核(x1,y1)
的点组成的,这是不容易定义的。