我曾尝试使用 sklearn 和 PyKrige(我认为更直观),但我的计算机内存不足(我假设是 RAM?我不是计算机专家)并且当我尝试插入我拥有的数据时崩溃。
获取约 6500 个数据点并将网格划分为 80x80 网格可以正常工作。但我需要在 500x500 网格上的 30,000 个数据点区域内的某个地方。
有没有可以解决这个问题的替代方案?
我曾尝试使用 sklearn 和 PyKrige(我认为更直观),但我的计算机内存不足(我假设是 RAM?我不是计算机专家)并且当我尝试插入我拥有的数据时崩溃。
获取约 6500 个数据点并将网格划分为 80x80 网格可以正常工作。但我需要在 500x500 网格上的 30,000 个数据点区域内的某个地方。
有没有可以解决这个问题的替代方案?
如果我没记错的话,高斯过程,如克里金法,缩放为 O(n³),即输入样本数的三次方。
我已经在具有 265GiB RAM 的机器上运行了一个包含大约 50k 样本的高斯过程,这会使一台“只有”128GiB 的计算机崩溃。您需要的确切数量还取决于您使用的库,以及它是否使用变量指数,或者内核宽度参数是否是各向同性的(即在每个维度上都相同)。
我认为有一些方法可以解决这个问题,但没有一个是容易的(而且我还没有全部尝试过):
1:可能是最简单的,如果您的数据采集的性质允许的话(但最不有效:不要在常规网格上采样,而是使用拉丁超立方体采样。这不会帮助您在 2D 中大幅降低采样密度(因为它在更高维度上更有效),但它也避免了恒定网格可能会丢失低于采样频率的特征的陷阱,同时将主频率引入模型。这意味着:您应该在模型中获得更少的振荡使用比常规网格不那么规则的东西,这可能会让你用更少的样本逃脱。
2:尝试不同的库。我刚刚遇到这个教程,它似乎通过近似一些计算来加快一维问题的速度。它还列出了几个实现高斯过程的不同库——其中一些可能或多或少具有内存效率。
3:使用 scikit-learn,我发现了一个处理有限 RAM 的技巧:为theta
. 您可以在 sklearn 中使用固定的 定义高斯过程,与将其包含在最大似然估计 (MLE) 中相比theta
,它占用的 RAM 少得多。然后,您可以选择自己在外部执行 MLE,作为 的函数theta
,或者如果您有合适的验证数据,您可以使用它来确定最小化标准以找到 的最佳值theta
。
4:还有 Dask,它可以将大型计算分布在多台机器上,所以也许这可以帮助你获得结果——但它需要你弄清楚 Dask 是如何工作的,并获得足够多的具有足够 RAM 的计算机来解决问题。除了 CPU 负载之外,由于需要并行通信,它也不会很快。
5:使用模板。我在其他一些软件中看到了这一点,它可以提供帮助,但它也会带来问题,除非你知道自己在做什么。基本思想是训练许多模型,每个模型只使用样本空间的某个区域,然后在它们之间切换/混合。有多种方法。一方面,您为每个数据点制作一个模型,该模型使用 n 个最接近的其他数据点,而在另一端,您只需定义 4 个或 8 个区域(有大量重叠!)。为了在它们之间进行混合,您可以使用内置的误差估计来计算一些加权混合函数。是否以及是否运作良好可能取决于您的数据的性质以及它是否/在何处改变特征,相对于您的区域的形状。
6:也许,如果你真的需要那么多数据来表示你想要建模的东西,一些更简单的方法,比如支持向量回归、径向基函数——或者一些更高级的方法,比如随机森林或简单/集成神经网络,可能会更好地为你服务. 我喜欢随机森林和 NN 集成等集成方法的想法,因为它们还提供了一些方法来估计模型输出的置信度。