在分散的数据中寻找最近的点

问题描述

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

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

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))进行插值并获取值。从分散的数据 xi、yi 和 zi 中找到 4 个相邻点的最快方法是什么,以便可以使用 interp2d(见下图)执行双线性插值。我不知道这是否会比使用 gridata 给我更快的结果,但是尝试一下会很好

enter image description here

解决方法

我认为您的想法本质上是最近邻回归。以下是使用 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]