如果我没记错的话,高斯过程(例如克里金法)的缩放比例为 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 集成等集成方法的想法,因为它们还提供了一些方法来估计模型输出的置信度。