aph*_*aph 7 python numpy scientific-computing scipy
该gaussian_kde函数scipy.stats具有如下功能:evaluate即可以返回一个输入点的PDF的值。我试图用来gaussian_kde估计逆 CDF。动机是生成一些输入数据的蒙特卡罗实现,其统计分布使用 KDE 进行数值估计。是否有绑定gaussian_kde到此目的的方法?
下面的例子展示了在高斯分布的情况下这应该如何工作。首先,我展示了如何进行 PDF 计算以设置我想要实现的特定 API:
import numpy as np
from scipy.stats import norm, gaussian_kde
npts_kde = int(5e3)
n = np.random.normal(loc=0, scale=1, size=npts_kde)
kde = gaussian_kde(n)
npts_sample = int(1e3)
x = np.linspace(-3, 3, npts_sample)
kde_pdf = kde.evaluate(x)
norm_pdf = norm.pdf(x)
Run Code Online (Sandbox Code Playgroud)
是否有类似的简单方法来计算逆 CDF?该norm函数有一个非常方便的isf函数,可以做到这一点:
cdf_value = np.sort(np.random.rand(npts_sample))
cdf_inv = norm.isf(1 - cdf_value)
Run Code Online (Sandbox Code Playgroud)
是否存在这样的函数kde_gaussian?或者从已经实现的方法构造这样的函数是否很简单?
小智 4
该方法integrate_box_1d可以用来计算CDF,但它不是矢量化的;你需要循环点。如果内存不是问题,以向量形式重写其源代码(本质上只是对 的调用special.ndtr)可能会加快速度。
from scipy.special import ndtr
stdev = np.sqrt(kde.covariance)[0, 0]
pde_cdf = ndtr(np.subtract.outer(x, n)).mean(axis=1)
plot(x, pde_cdf)
Run Code Online (Sandbox Code Playgroud)
反函数的图为plot(pde_cdf, x)。如果目标是计算特定点处的反函数,请考虑使用插值样条函数的反函数,对 CDF 的计算值进行插值。