`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.KernelDensity
和 statsmodels.nonparametric
似乎都不支持加权样本。我修改了scipy.stats.gaussian_kde
以允许不同的采样权重,并认为结果可能对其他人有用。下面是一个例子。
ipython
笔记本可以在这里找到:http://nbviewer.ipython.org/gist/tillahoffmann/f844bce2ec264c1c8cb5
实现细节
加权算术平均值为
unbiased data covariance matrix 由下式给出
带宽可以通过scott
或silverman
规则选择,如scipy
。但是,用于计算带宽的样本数是Kish's approximation for the effective sample size。
【讨论】:
您是否考虑过让scipy
开发人员将您的代码集成到scipy
或statsmodels
中?
是的,但我还没有开始实施重采样和集成。完成后我会发出拉取请求。
我一直在研究类似的问题,但使用我自己的框架而不是修改 scipy.我没想过使用 Kish 的近似值。你认为它是最好的带宽估计器吗?它使用相同的有效样本大小重新加权数据集中的每个点。我想知道可变带宽是否更有意义。
要重新采样,用 np.random.choice(xrange(0, self.n), p=self.weights/np.sum(self.weights) 替换重新采样函数 randint 是否正确), 大小=大小) ?
是的,应该没问题。但是,您可能最好使用np.arange
而不是xrange
,因为 numpy 经常在内部转换为数组。但是测试会比我的猜测要好。以上是关于`python`中的加权高斯核密度估计的主要内容,如果未能解决你的问题,请参考以下文章