2

我想更多地了解高斯过程回归:我在这里使用 scikit-learn 实现,我想拟合单点而不是拟合一整套点。但是得到的 alpha 系数应该保持不变,例如

gpr2 = GaussianProcessRegressor()
    for i in range(x.shape[0]):
        gpr2.fit(x[i], y[i])

应该是一样的

gpr = GaussianProcessRegressor().fit(x, y)

但是当访问gpr2.alpha_and时gpr.alpha_,它们是不一样的。这是为什么?

事实上,我正在从事一个出现新数据点的项目。我不想附加 x、y 数组并再次适合整个数据集,因为它非常耗时。让 x 的大小为 n,那么我有:

n+(n-1)+(n-2)+...+1 € O(n^2) 配件

当考虑到拟合本身是二次的(如果我错了,请纠正我),运行时间复杂度应该在 O(n^3) 中。如果我对 n 个点进行一次拟合,那将是更理想的:

1+1+...+1 = n € O(n)

4

2 回答 2

3

你说的其实就是在线学习或者增量学习;它本身就是机器学习的一个巨大子领域,并不是所有 scikit-learn 模型都可以开箱即用。引用相关文档

尽管并非所有算法都可以增量学习(即一次不查看所有实例),但所有实现partial_fitAPI 的估计器都是候选者。实际上,从小批量实例中增量学习的能力(有时称为“在线学习”)是核外学习的关键,因为它保证在任何给定时间,在主内存。

在上面链接文档中的这段摘录之后,有一个当前支持增量学习的所有 scikit-learn 模型的完整列表,您可以从中看到这不是GaussianProcessRegressor其中之一。

于 2020-04-04T12:59:47.887 回答
1

虽然sklearn.gaussian_process.GaussianProcessRegressor不直接实现增量学习,但没有必要从头开始完全重新训练您的模型。

要完全了解其工作原理,您应该了解 GPR 基础知识。关键思想是训练 GPR 模型主要包括优化内核参数以最小化某些目标函数(默认情况下为对数边际似然)。当在相似的数据上使用相同的内核时,这些参数可以被重用。由于优化器具有基于收敛的停止条件,因此可以通过使用预先训练的值(所谓的热启动)初始化参数来加速重新优化。

下面是一个基于sklearn docs中的示例。

from time import time
from sklearn.datasets import make_friedman2
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel
X, y = make_friedman2(n_samples=1000, noise=0.1, random_state=0)
kernel = DotProduct() + WhiteKernel()

start = time()
gpr = GaussianProcessRegressor(kernel=kernel,
        random_state=0).fit(X, y)
print(f'Time: {time()-start:.3f}')
# Time: 4.851
print(gpr.score(X, y))
# 0.3530096529277589

# the kernel is copied to the regressor so we need to 
# retieve the trained parameters
kernel.set_params(**(gpr.kernel_.get_params()))

# use slightly different data
X, y = make_friedman2(n_samples=1000, noise=0.1, random_state=1)

# note we do not train this model
start = time()
gpr2 = GaussianProcessRegressor(kernel=kernel,
        random_state=0).fit(X, y)
print(f'Time: {time()-start:.3f}')
# Time: 1.661
print(gpr2.score(X, y))
# 0.38599549162834046

您可以看到,与从头开始培训相比,再培训的时间要短得多。尽管这可能不是完全增量的,但它可以帮助加快在流数据设置中的训练。

于 2021-03-24T11:08:57.923 回答