高斯核中最大值坐标的快速搜索
我有一段简单的代码,用来生成一个二维的高斯核,这个过程是通过 scipy.stats.gaussian_kde 函数实现的。
下面是我的 MWE
(最小可重现示例):
def random_data(N):
# Generate some random data.
return np.random.uniform(0., 10., N)
# Data lists.
x_data = random_data(10000)
y_data = random_data(10000)
# Obtain the KDE for this region.
kernel = stats.gaussian_kde(np.vstack([x_data, y_data]), bw_method=0.05)
这是生成的结果:
我想要的是找到这个核密度估计中 x,y
坐标的 最大值。
根据我从不同来源了解到的信息,直接找到最大值的方法是先在一个细网格上计算 kernel
,然后用 np.argmax
来找出最大值,具体如下:
# define grid.
xmin, xmax = min(x_data), max(x_data)
ymin, ymax = min(y_data), max(y_data)
x, y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([x.ravel(), y.ravel()])
# THIS IS TOO SLOW.
k_pos = kernel(positions)
# Print max value.
print k_pos[np.argmax(k_pos)]
# Print x,y coordinates of max value.
print positions.T[np.argmax(k_pos)]
不过这样做的问题是,计算核的过程非常慢,几乎让人无法使用,尤其是对于数据量不大的情况。
有没有更好的方法来获取最大值的坐标呢?
另外,如果能找到一种更快的方法来在细网格上计算核,那就更好了,这样也能加快绘图速度。
1 个回答
-1
np.argmax(kernel)
这可能正是你想要的...
可以看看这个链接: http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html