Enr*_*lsh 5 numpy scipy statsmodels
我对使用点样本构建KDE感兴趣,然后使用该KDE对点进行重采样。scipy.stats.gaussian_kde提供了一种非常简单的方法来执行此操作。例如,从高斯分布中采样:
import numpy as np
from scipy.stats import gaussian_kde, norm
sampled = np.random.normal(loc = 0, scale = 1, size = 1000)
kde = gaussian_kde(sampled, bw_method = 'silverman')
resampled = kde.resample(1000)
Run Code Online (Sandbox Code Playgroud)
它的一个缺点scipy.stats.gaussian_kde是它提供有限的带宽选择选项。通过阅读此内容,我被指向statsmodels.nonparametric.kernel_density.KDEMultivariate(在此处有更多信息)。这使我可以使用交叉验证来估计最佳带宽,如果您要近似估算的基础pdf不是单峰的,则带宽更为复杂。例如,使用两个高斯之和,我可以使用KDEMultivariate以下方法构造一个KDE :
from statsmodels.nonparametric.kernel_density import KDEMultivariate
sampled = np.concatenate((np.random.normal(loc = -3, scale = 1, size = 1000), \
np.random.normal(loc = 3, scale = 1, size = 1000)))
kde = KDEMultivariate(sampled, 'c', bw = 'cv_ml')
Run Code Online (Sandbox Code Playgroud)
通过使用任意基础的pdf探索更高维度的数据,很明显,KDEMultivariate它能够生成一个更能代表原始PDF的PDF。但是我遇到了一个大问题- KDEMultivariate没有kde.resample()方法,因此我无法从新的KDE中重新采样点。有没有一种简单有效的方法可以从使用构造的KDE重采样statsmodels.nonparametric.kernel_density.KDEMultivariate?
gaussian_kde利用in的动机scipy,我编写了一个简单的重采样程序。在 中statsmodels,带宽对应于每个维度中高斯核的 SD。在scipy中,带宽^2乘以数据协方差来构造协方差矩阵。
def resample(kde, size):
n, d = kde.data.shape
indices = np.random.randint(0, n, size)
cov = np.diag(kde.bw)**2
means = kde.data[indices, :]
norm = np.random.multivariate_normal(np.zeros(d), cov, size)
return np.transpose(means + norm)
Run Code Online (Sandbox Code Playgroud)
这采用 的一个实例KDEMultivariate,并通过选择随机内核对其进行重新采样,然后利用每个内核遵循多元正态分布的事实从这些内核中进行采样。