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