在 R 中有效地插入网格中的值
Interpolate values from a grid efficiently in R
我有一个按位置划分的海洋深度数据网格,我正在尝试为选定的 GPS 点插入深度值。
我们一直在使用 RSAGA::pick.from.points,它适用于小型数据集。
require(RSAGA)
depthdata <- cbind.data.frame(x=c(74.136, 74.135, 74.134, 74.133, 74.132, 74.131, 74.130, 74.129, 74.128, 74.127),
y=rep(40, times=10),
depth=c(-0.6, -0.6, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -0.6, -0.6))
mylocs <- rbind(c(-74.1325, 40), c(-74.1305, 40))
colnames(mylocs) <- c("x", "y")
results <- pick.from.points(data=mylocs, src=depthdata, pick=c("depth"), method="nearest.neighbour")
mydepths <- results$depth
但是我们的深度数据集包含 6900 万个数据点,并且我们有 500 万个 GPS 点需要进行深度估算和选择。from.points 只是花费的时间太长(> 2 周)对于这个数据集。我们认为我们可以在 MATLAB 或 ArcMap 中更快地完成此任务,但我们正在尝试将此任务合并到我们为其他人编写的更长的 R 工作流程中 运行 重复,因此切换到专有该工作流程的一部分的软件不太理想。
我们愿意为了速度牺牲一定程度的准确性。
我已尽我所能寻找解决方案,但我对网格数据和插值还很陌生,因此可能使用了不恰当的语言,因此缺少一个简单的解决方案。
如果您愿意通过查找最近邻居并使用其值来估算,我认为诀窍是使用有效的最近邻居实现,它允许您在 O(log( n)) 时间。 k-d 树提供了这种性能,并且可以通过 R 中的 FNN 包获得。虽然计算(基于随机生成的数据,其中包含 6900 万个数据点供参考和 500 万个数据点进行估算)不是即时的(它大约需要3 分钟),比 2 周快多了!
data <- cbind(x=rnorm(6.9e7), y=rnorm(6.9e7))
labels <- rnorm(6.9e7)
query <- cbind(x=rnorm(5e6), y=rnorm(5e6))
library(FNN)
get.nn <- function(data, labels, query) {
nns <- get.knnx(data, query, k=1)
labels[nns$nn.index]
}
system.time(get.nn(data, labels, query))
# user system elapsed
# 174.975 2.236 177.617
作为警告,该进程的峰值约为 10GB RAM,因此您将需要大量内存资源来 运行 在您的大小的数据集上。
我有一个按位置划分的海洋深度数据网格,我正在尝试为选定的 GPS 点插入深度值。
我们一直在使用 RSAGA::pick.from.points,它适用于小型数据集。
require(RSAGA)
depthdata <- cbind.data.frame(x=c(74.136, 74.135, 74.134, 74.133, 74.132, 74.131, 74.130, 74.129, 74.128, 74.127),
y=rep(40, times=10),
depth=c(-0.6, -0.6, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -0.6, -0.6))
mylocs <- rbind(c(-74.1325, 40), c(-74.1305, 40))
colnames(mylocs) <- c("x", "y")
results <- pick.from.points(data=mylocs, src=depthdata, pick=c("depth"), method="nearest.neighbour")
mydepths <- results$depth
但是我们的深度数据集包含 6900 万个数据点,并且我们有 500 万个 GPS 点需要进行深度估算和选择。from.points 只是花费的时间太长(> 2 周)对于这个数据集。我们认为我们可以在 MATLAB 或 ArcMap 中更快地完成此任务,但我们正在尝试将此任务合并到我们为其他人编写的更长的 R 工作流程中 运行 重复,因此切换到专有该工作流程的一部分的软件不太理想。
我们愿意为了速度牺牲一定程度的准确性。
我已尽我所能寻找解决方案,但我对网格数据和插值还很陌生,因此可能使用了不恰当的语言,因此缺少一个简单的解决方案。
如果您愿意通过查找最近邻居并使用其值来估算,我认为诀窍是使用有效的最近邻居实现,它允许您在 O(log( n)) 时间。 k-d 树提供了这种性能,并且可以通过 R 中的 FNN 包获得。虽然计算(基于随机生成的数据,其中包含 6900 万个数据点供参考和 500 万个数据点进行估算)不是即时的(它大约需要3 分钟),比 2 周快多了!
data <- cbind(x=rnorm(6.9e7), y=rnorm(6.9e7))
labels <- rnorm(6.9e7)
query <- cbind(x=rnorm(5e6), y=rnorm(5e6))
library(FNN)
get.nn <- function(data, labels, query) {
nns <- get.knnx(data, query, k=1)
labels[nns$nn.index]
}
system.time(get.nn(data, labels, query))
# user system elapsed
# 174.975 2.236 177.617
作为警告,该进程的峰值约为 10GB RAM,因此您将需要大量内存资源来 运行 在您的大小的数据集上。