如何在大型数据集上执行克里金(高斯过程回归)?

Posted

技术标签:

【中文标题】如何在大型数据集上执行克里金(高斯过程回归)?【英文标题】:How to perform kriging (Gaussian process regression) on a large dataset? 【发布时间】:2022-01-10 05:20:33 【问题描述】:

我曾尝试使用 sklearn 和 PyKrige(我认为更直观),但我的计算机内存不足(我认为是 RAM?我不是计算机专家)并且当我尝试插入我拥有的数据时崩溃.

获取约 6500 个数据点并将网格划分为 80x80 网格可以正常工作。但我需要在 500x500 网格上的 30,000 个数据点区域内的某个地方。

有没有其他方法可以解决这个问题?

【问题讨论】:

【参考方案1】:

如果我没记错的话,高斯过程(例如克里金法)的缩放比例为 O(n³),即输入样本数的三次方。

我已经在具有 265GiB RAM 的机器上运行了一个包含大约 50k 样本的高斯过程,这会使一台“只有”128GiB 的计算机崩溃。 您需要的确切数量还取决于您使用的库,以及它是否使用变量指数,或者内核宽度参数是否是各向同性的(即每个维度都相同)。

我认为有一些方法可以解决这个问题,但没有一个是容易的(而且我还没有全部尝试过):

1:如果数据采集的性质允许,可能最简单(但效果最差:不要在常规网格上采样,而是使用Latin Hypercube sampling。这不会帮助您大大降低采样密度在 2D 中(因为它在更高维度上更有效),但它也避免了恒定网格可能会丢失低于采样频率的特征的陷阱,同时将主频率引入模型。这意味着:你应该得到更少的振荡通过使用比常规网格不那么规则的东西来创建模型,这可能使您可以使用更少的样本。

2:尝试不同的库。我刚刚遇到this tutorial,它似乎通过近似一些计算来加快一维问题的速度。它还列出了几个不同的库,它们实现了高斯过程——其中一些可能或多或少的内存效率。

3:通过 scikit-learn,我发现了一个处理有限 RAM 的技巧:为 theta 编写自己的最小化循环。您可以在 sklearn 中使用固定的 theta 定义高斯过程,与将其包含在最大似然估计 (MLE) 中相比,它占用的 RAM 要少得多。然后,您可以选择自己在外部执行 MLE,作为 theta 的函数,或者如果您有合适的验证数据,您可以使用它来确定最小化标准以找到 theta 的最佳值。

4:还有 Dask,它可以将大型计算分布在多台机器上,所以也许这可以帮助您获得结果 - 但它需要您弄清楚 Dask 的工作原理,并获得足够多的计算机的访问权限RAM 来解决问题。它也不会很快,因为除了 CPU 负载之外还需要并行通信。

5:使用模板。我在其他一些软件中看到了这一点,它可以提供帮助,但它也会带来问题,除非你知道自己在做什么。基本思想是训练许多模型,每个模型只使用样本空间的某个区域,然后在它们之间切换/混合。有多种方法。一方面,您为每个数据点制作一个模型,该模型使用 n 个最接近的其他数据点,而在另一端,您只需定义 4 个或 8 个区域(有大量重叠!)。为了在它们之间进行混合,您可以使用内置的误差估计来计算一些加权混合函数。这是否以及是否有效可能取决于您的数据的性质以及它是否/在哪里改变了特征,相对于您的区域的形状。

6:也许,如果你真的需要这么多数据来表示你想要建模的东西,一些更简单的方法,比如支持向量回归、径向基函数——或者一些更高级的方法,比如随机森林或简单/集成神经网络,可能更好地为您服务。我喜欢随机森林和 NN 集成等集成方法的想法,因为它们还提供了一些方法来估计模型输出的置信度。

【讨论】:

以上是关于如何在大型数据集上执行克里金(高斯过程回归)?的主要内容,如果未能解决你的问题,请参考以下文章

具有多个变量的高斯过程回归:内核的适应

如何使用 GPML (Matlab) 进行二维高斯过程进行回归?

贝叶斯岭回归(BayesianRidge)自动关联决策回归高斯过程核函数及高斯回归高斯过程分类

使用scikit-learn的高斯过程回归时如何使用点的经纬度?

在 sklearn python 中使用高斯过程回归时出错

数据可视化应用Python-pykrige包-克里金(Kriging)插值计算及可视化绘制