高斯核中最大值坐标的快速搜索

4 投票
1 回答
2812 浏览
提问于 2025-04-18 00:09

我有一段简单的代码,用来生成一个二维的高斯核,这个过程是通过 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)

这是生成的结果:

enter image description here

我想要的是找到这个核密度估计中 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

撰写回答