我有一个简单的代码,可以使用以下命令生成 2D 高斯内核scipy.stats.gaussian_kde http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.stats.gaussian_kde.html功能。
这是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
的坐标最大值在这个 KDE 中。
对于我从各种来源收集到的信息,找到最大值的直接方法似乎是评估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)]
问题是评估内核是非常慢,几乎到了无法用于不太大的数据集的程度。
有没有更好的方法来获取最大值的坐标?
也被接受(也许更好,因为它还允许快速绘图):是否有faster如何在精细网格中评估内核?