Numpy 在stats模型中对KDE(核密度估计)进行重采样

Numpy 在stats模型中对KDE(核密度估计)进行重采样,numpy,scipy,statsmodels,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 = 'silve

我感兴趣的是使用点样本构建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)
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')

使用任意底层pdf探索高维数据,显然
KDEMultivariate
能够生成更能代表原始pdf的pdf。但是我遇到了一个大问题--
KDEMultivariate
没有
kde.resample()
方法,因此我无法从我的新kde重新采样点。有没有一种简单而有效的方法可以从使用statsmodels.非参数.核密度.多变量的KDE中重新采样?

scipy
中,我使用了来自
高斯KDE
的动机编写了一个简单的重新采样程序。在
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)

这将以
KDEMultivariate
为例,通过选择随机核对其重新采样,然后使用每个核遵循多元正态分布的事实从这些核中采样。

阅读
resample()
的源代码后,我认为在
KDEMultivariate
中实现它并不困难。这相当笨拙,但我只会使用KDEMultivariate来估计带宽,然后在一个
gaussian_kde
实例中使用它。scipy构造协方差矩阵的方式与statsmodels构造协方差矩阵的方式根本不同矩阵。如果我理解正确,scipy有一个带宽,它乘以数据协方差。这将在所有维度中提供相同的平滑(按数据的标准偏差缩放)。在statsmodels中,带宽是一个数组,对应于每个维度中高斯核的SD。因此,不能将statsmodels中的带宽输出(这是一个数组)传递给scipy的带宽参数(这是一个数字)。