【问题标题】:Finding nearest points in a scattered data在分散的数据中查找最近的点
【发布时间】:2021-05-25 10:21:41
【问题描述】:

我正在努力提高我正在使用 gridfit 插值的大型数据集的插值速度。我已经在 stackoverflow 上发布了question,但没有得到回复

所以,我正在考虑尝试一些替代方法。我的想法是,如果我有一个庞大的数据集,如下面的 Python 代码 sn-p 所示

arr_len = 932826
xi = np.random.uniform(low=0, high=4496, size=arr_len)
yi = np.random.uniform(low=-74, high=492, size=arr_len)
zi = np.random.uniform(low=-30, high=97, size=arr_len)

我必须插值并获取定义点的值,例如 (x, y)。使用 interp2d 从分散的数据 xi、yi 和 zi 中找到 4 个相邻点以便执行双线性插值的最快方法是什么(见下图)。我不知道这是否会给我比使用 gridata 更快的结果,但我会很高兴尝试一下

【问题讨论】:

  • 我认为您可以将那些xiyizi 传递给interp2d? “x、y 和 z 是用于逼近某个函数 f 的值的数组:z = f(x, y)。此类返回一个函数,其调用方法使用样条插值来查找新点的值。”
  • @AKX:我试过了,但是 interp2d 无法处理这么大的数据集,所以想考虑替代方案
  • 如何定义“4 个相邻点”?具体来说,在您的图片中,如果 x1 是小于 x 的所有 xi 的最大值,并且 y1 是小于 y 的所有 yi 的最大值,则 x1 和 y1 不一定属于数据集中的同一点,对?所以你可能不知道 Q11 的 z 值。还是我错过了什么?
  • 也许您想要做的基本上是最近邻回归?如果是这样,您可以使用 scikit-learn:scikit-learn.org/stable/modules/neighbors.html#neighbors
  • @Arne :是的,你是对的,如果我们按照你的定义进行搜索,那么我们最终可能会得到离散点,这可能不会给我们 Q11。我的想法是把这个区域分成4个象限,然后搜索一个象限中的所有点。然后根据与 x,y 的距离排序最近的点,得到一个唯一的数字。但后来感觉计算量也很大!

标签: python numpy scipy interpolation bilinear-interpolation


【解决方案1】:

我认为您的想法本质上是最近邻回归。这是使用 scikit-learn 执行此操作的方法。请注意,所考虑的邻居数 4 是任意选择,因此您也可以尝试其他值。

import numpy as np
from sklearn.neighbors import KNeighborsRegressor

arr_len = 932826
np.random.seed(42)
xi = np.random.uniform(low=0, high=4496, size=arr_len)
yi = np.random.uniform(low=-74, high=492, size=arr_len)
zi = np.random.uniform(low=-30, high=97, size=arr_len)

# points to get z-values for (e.g.):
x_new = [100, 500, 2000]
y_new = [400, 300, 100]

# in machine learning notation:
X_train = np.vstack([xi, yi]).T
y_train = zi
X_predict = np.vstack([x_new, y_new]).T

# fit 4-nearest neighbors regressor to the training data
neigh = KNeighborsRegressor(n_neighbors=4)
neigh.fit(X_train, y_train)

# get "interpolated" z-values
print(neigh.predict(X_predict))
[39.37712018  4.36600728 47.00192216]

【讨论】:

  • 您非常喜欢这种优雅的方法。学习一种新方法真的很好 我有一个问题是在某些区域不存在任何数据,但由于它使用最近的,它无论如何都会用一些数据填充它。我怎样才能避免它?例如,如果 x+/-x1 和 y+/-y1 中不存在任何数据,那么有什么方法可以拒绝计算这些点的值,而是使用 NaN。我知道我可以手动完成,但想知道是否可以直接在代码中处理
  • 我还发现,由于我的数据集非常密集,使用带有“最近”选项的 gridfit 提供了几乎相似的结果,就像我使用“线性”插值一样,而且速度也非常快,因为它只需要取最接近的值
  • 另外,您能否告诉我,当它检查最近的时,它会查看探测点周围的数据吗?例如,如果我们在给定点周围的四个象限中定义数据,它会在预测一个值之前查看所有四个象限,还是只查看 4 个最近点或 x 个最近点,具体取决于我们在邻居中指定的数量跨度>
  • 为避免预测空区域,您可以使用RadiusNeighborsRegressor 而不是KNeighborsRegressor。这将使用指定半径内的所有点进行预测,如果没有,它将输出NaN。见:scikit-learn.org/stable/modules/generated/…
  • 在我编写上面的代码时,4 个最近邻用于预测,其中“最近”表示根据欧几里得距离。但您也可以通过指定 metric 参数来选择其他指标。见:scikit-learn.org/stable/modules/generated/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2021-07-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多