【问题标题】:Fast search for the coordinates of the maximum value in a gaussian kernel快速搜索高斯核中最大值的坐标
【发布时间】:2014-03-27 14:19:23
【问题描述】:

我有一个使用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)

结果如下:

我需要的是一种在这个KDE中获取最大值的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)]

这样做的问题是评估内核非常慢,几乎到了无法用于不太大的数据集的地步。

有没有更好的方法来获取最大值的坐标?

也被接受(也许更好,因为它还允许快速绘图):有没有一种更快的方法来评估细网格中的内核?

【问题讨论】:

  • 如果你先bin你的数据,那么你可以使用卷积和fft。基于 statsmodels fft 的 KDE 仅适用于 1d,但在 python 中有 2d recipes 可用。
  • @user333700 对数据进行分箱会导致末端坐标的精度损失。
  • 使用np.unravel_index(np.argmax(k), k.shape)从argmax获取坐标

标签: python performance numpy scipy max


【解决方案1】:
np.argmax(kernel)

可能就是你要找的……

见:http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html

【讨论】:

  • 不,已经试过了。它返回值0。还是谢谢!
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 2011-05-11
  • 2017-07-18
  • 1970-01-01
  • 2018-10-31
  • 2015-10-08
  • 2012-10-19
  • 1970-01-01
相关资源
最近更新 更多