Python fastKDE超出了数据点的限制

时间:2016-11-23 04:27:04

标签: python kernel-density

我尝试使用fastKDE软件包(https://pypi.python.org/pypi/fastkde/1.0.8)来查找2D图中点的KDE。但是,我想知道KDE超出了数据点的限制,并且无法弄清楚如何做到这一点。

使用上面链接的网站上列出的代码;

#!python

import numpy as np
from fastkde import fastKDE
import pylab as PP

#Generate two random variables dataset (representing 100000 pairs of datapoints)
N = 2e5
var1 = 50*np.random.normal(size=N) + 0.1
var2 = 0.01*np.random.normal(size=N) - 300

#Do the self-consistent density estimate
myPDF,axes = fastKDE.pdf(var1,var2)

#Extract the axes from the axis list
v1,v2 = axes

#Plot contours of the PDF should be a set of concentric ellipsoids centered on
#(0.1, -300) Comparitively, the y axis range should be tiny and the x axis range
#should be large
PP.contour(v1,v2,myPDF)
PP.show()

我能够在数据限制范围内的任何点找到KDE,但是如何找到KDE表示点(0,300),而不必将其包含在var1和var2中。我不希望用这个数据点计算KDE,我想知道那时的KDE。

我想我真正希望能够为fastKDE提供数据的直方图,这样我就可以自己设置轴。我只是不知道这是否可能?

干杯

2 个答案:

答案 0 :(得分:2)

我也一直在试验这段代码并遇到了同样的问题。我所做的(代替一个好的N-D外推器)是从fastKDE返回的网格点构建一个KDTree(带有scipy.spatial),并找到最接近我要评估的点的网格点。然后我在该点查找相应的pdf值(如果不是相同的零,它应该在pdf网格的边缘附近很小)并相应地分配该值。

答案 1 :(得分:0)

我在寻找此问题的解决方案时遇到了这篇文章。与构建KDTree类似,您可以只在每个网格维度上计算步长,然后通过仅用轴的起点减去点值并除以该维的步长来获取查询点的索引,最后对其进行四舍五入关闭,将其转换为整数和瞧。以一维为例:

def fastkde_test(test_x):
    kde, axes = fastKDE.pdf(test_x, numPoints=num_p)
    x_step = (max(axes)-min(axes)) / len(axes)
    x_ind = np.int32(np.round((test_x-min(axes)) / x_step))
    return kde[x_ind]

在这种情况下,test_x是用于定义KDE的集合和查询集。在我的情况下,这样做的速度略微提高了10倍(至少在一维中,尚未测试的更高尺寸),并且基本上与KDTree查询相同。

我希望这能像我刚才那样帮助将来遇到此问题的任何人。

编辑:如果查询点超出了计算KDE的范围,则此方法当然只能为您提供与KDTree查询相同的结果,即KDE网格的相应边界。但是,您必须通过在最高索引(即“ len(axes)-1”)处剪切所得的x_ind来对此进行硬编码。