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

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

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

【问题讨论】:

  • 从 scipy 1.2 版开始,在 sp.stats.gaussian_kde 中似乎有一个“权重”选项,它似乎可以满足您现在的需求。

标签: python statistics scipy kernel-density


【解决方案1】:

对于单变量分布,您可以使用来自statsmodelsKDEUnivariate。它没有很好的文档记录,但 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 经常在内部转换为数组。但是测试会比我的猜测要好。
    猜你喜欢
    • 2021-01-21
    • 2012-04-06
    • 2015-08-28
    • 2021-11-13
    • 1970-01-01
    • 2015-10-01
    • 2021-07-11
    • 2013-09-14
    相关资源
    最近更新 更多