`python`中的加权高斯核密度估计

Posted

技术标签:

【中文标题】`python`中的加权高斯核密度估计【英文标题】:Weighted Gaussian kernel density estimation in `python` 【发布时间】:2015-02-21 19:19:55 【问题描述】:

更新scipy.stats.gaussian_kde 现在支持加权样本。详情请参阅here 和here。

目前无法使用scipy.stats.gaussian_kde 来估计基于weighted samples 的随机变量的密度。基于加权样本估计连续随机变量密度的方法有哪些?

【问题讨论】:

从 scipy 1.2 版开始,在 sp.stats.gaussian_kde 中似乎有一个“权重”选项,它似乎可以满足您现在的需求。 【参考方案1】:

对于单变量分布,您可以使用来自statsmodels 的KDEUnivariate。它没有很好的文档记录,但 fit 方法接受 weights 参数。那么你不能使用FFT。这是一个例子:

import matplotlib.pyplot as plt
from statsmodels.nonparametric.kde import KDEUnivariate

kde1= KDEUnivariate(np.array([10.,10.,10.,5.]))
kde1.fit(bw=0.5)
plt.plot(kde1.support, [kde1.evaluate(xi) for xi in kde1.support],'x-')

kde1= KDEUnivariate(np.array([10.,5.]))
kde1.fit(weights=np.array([3.,1.]), 
         bw=0.5,
         fft=False)
plt.plot(kde1.support, [kde1.evaluate(xi) for xi in kde1.support], 'o-')

产生这个数字:

【讨论】:

【参考方案2】:

查看 Python 的 PyQT-Fit 和统计数据包。他们似乎使用加权观察进行核密度估计。

【讨论】:

请注意,从 1.3.4 版本开始,PyQT-Fit 仅支持一维核密度估计。【参考方案3】:

sklearn.neighbors.KernelDensitystatsmodels.nonparametric 似乎都不支持加权样本。我修改了scipy.stats.gaussian_kde 以允许不同的采样权重,并认为结果可能对其他人有用。下面是一个例子。

ipython 笔记本可以在这里找到:http://nbviewer.ipython.org/gist/tillahoffmann/f844bce2ec264c1c8cb5

实现细节

加权算术平均值为

unbiased data covariance matrix 由下式给出

带宽可以通过scottsilverman 规则选择,如scipy。但是,用于计算带宽的样本数是Kish's approximation for the effective sample size。

【讨论】:

您是否考虑过让scipy 开发人员将您的代码集成到scipystatsmodels 中? 是的,但我还没有开始实施重采样和集成。完成后我会发出拉取请求。 我一直在研究类似的问题,但使用我自己的框架而不是修改 scipy.我没想过使用 Kish 的近似值。你认为它是最好的带宽估计器吗?它使用相同的有效样本大小重新加权数据集中的每个点。我想知道可变带宽是否更有意义。 要重新采样,用 np.random.choice(xrange(0, self.n), p=self.weights/np.sum(self.weights) 替换重新采样函数 randint 是否正确), 大小=大小) ? 是的,应该没问题。但是,您可能最好使用np.arange 而不是xrange,因为 numpy 经常在内部转换为数组。但是测试会比我的猜测要好。

以上是关于`python`中的加权高斯核密度估计的主要内容,如果未能解决你的问题,请参考以下文章

scipy.stats :高斯核密度估计器中的带宽因子

什么是gis核密度计算

Python中的多变量核密度估计

python(sklearn)中的二维核密度估计如何工作?

数据的核密度估计及其可视化:Python实现

数据的核密度估计及其可视化:Python实现