我需要使用 scikit-learn 库在 Python 中实现 GPR(高斯过程回归)。
我的输入 X 有两个功能。前任。X=[x1, x2]。并且输出是一维 y=[y1]
我想使用两个内核;RBF 和 Matern,这样 RBF 使用“x1”功能,而 Matern 使用“x2”功能。我尝试了以下方法:
import numpy as np
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern as M, RBF as R
X = np.matrix([[1.,2], [3.,4], [5.,1], [6.,5],[4, 7.],[ 9,8.], [1.,2], [3.,4], [5.,1], [6.,5],[4, 7.],[ 9,8.],[1.,2], [3.,4], [5.,1], [6.,5],[4, 7.],[ 9,8.]]).T
y=[0.84147098, 0.42336002, -4.79462137, -1.67649299, 4.59890619, 7.91486597, 0.84147098, 0.42336002, -4.79462137, -1.67649299, 4.59890619, 7.91486597, 0.84147098, 0.42336002, -4.79462137, -1.67649299, 4.59890619, 7.91486597]
kernel = R(X[0]) * M(X[1])
gp = GaussianProcessRegressor(kernel=kernel) …Run Code Online (Sandbox Code Playgroud) 我正在使用 sklearn 的 GPR 库,但偶尔会遇到这个烦人的警告:
ConvergenceWarning: lbfgs failed to converge (status=2):
ABNORMAL_TERMINATION_IN_LNSRCH.
Increase the number of iterations (max_iter) or scale the data as shown in:
https://scikit-learn.org/stable/modules/preprocessing.html
_check_optimize_result("lbfgs", opt_res)
Run Code Online (Sandbox Code Playgroud)
我不仅几乎找不到有关此警告的文档,而且 max_iter 根本不是 sklearn 的 GPR 模型中的参数。我试图按照建议重新调整数据,但它没有用,坦率地说我不理解它(我还需要调整输出吗?同样,很少有文档)。
增加优化过程中的最大迭代次数是有道理的,但 sklearn 似乎没有办法做到这一点,这令人沮丧,因为他们建议这样做以响应此警告。
查看 GPR源代码,这是 sklearn 调用优化器的方式,
def _constrained_optimization(self, obj_func, initial_theta, bounds):
if self.optimizer == "fmin_l_bfgs_b":
opt_res = scipy.optimize.minimize(
obj_func, initial_theta, method="L-BFGS-B", jac=True,
bounds=bounds)
_check_optimize_result("lbfgs", opt_res)
theta_opt, func_min = opt_res.x, opt_res.fun
elif callable(self.optimizer):
theta_opt, func_min = \
self.optimizer(obj_func, initial_theta, bounds=bounds)
else:
raise ValueError("Unknown …Run Code Online (Sandbox Code Playgroud) 我有一组观察值 ,f_i=f(x_i)并且我想构造一个概率代理 ,f(x) ~ N[mu(x), sigma(x)]其中N是正态分布。每个观察到的输出f_i与测量不确定度 相关联sigma_i。我想将这些测量不确定性纳入我的替代项 中f_i,以便mu(x)预测观测值 ,f_i(x_i)并且预测的标准差sigma(x_i)包含观测输出 中的不确定性epsilon_i。
我能想到的实现这一目标的唯一方法是通过蒙特卡洛采样和高斯过程建模的结合。在没有蒙特卡洛样本的情况下,使用单个高斯过程来完成此任务是理想的,但我无法完成这项工作。
我展示了实现我的目标的三种尝试。前两个避免了蒙特卡罗采样,但不预测f(x_i)包含 的不确定带的平均值epsilon(x_i)。第三种方法使用蒙特卡罗采样并完成我想做的事情。
有没有一种方法可以创建一个高斯过程,平均预测平均观测输出,并且不确定性将包含观测输出中的不确定性,而不使用这种蒙特卡罗方法?
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, Matern, ExpSineSquared, WhiteKernel
# given a set of inputs, x_i, and corresponding outputs, f_i, I want to make a surrogate f(x).
# each f_i …Run Code Online (Sandbox Code Playgroud) 我开始使用 Sklearn 库使用我自己的数据点学习高斯回归,如下所示。虽然我得到的结果是不准确的,因为我没有进行超参数优化。我做了一些谷歌搜索并编写了gridsearch代码。但代码没有按预期运行。我不知道我在哪里犯了错误,请帮助并提前致谢。
输入和输出数据的样本如下
X_tr= [10.8204 7.67418 7.83013 8.30996 8.1567 6.94831 14.8673 7.69338 7.67702 12.7542 11.847]
y_tr= [1965.21 854.386 909.126 1094.06 1012.6 607.299 2294.55 866.316 822.948 2255.32 2124.67]
X_te= [7.62022 13.1943 7.76752 8.36949 7.86459 7.16032 12.7035 8.99822 6.32853 9.22345 11.4751]
Run Code Online (Sandbox Code Playgroud)
X_tr, y_tr和X_te是训练数据点,是重塑值,并且具有“float64 数组”类型
这是我的网格搜索代码
from sklearn.model_selection import GridSearchCV
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
scores = ['precision', 'recall']
for score in scores: …Run Code Online (Sandbox Code Playgroud)