使用scikit-learn实现多输出高斯过程回归的预测问题问询
用scikit-learn实现多输出高斯过程回归(GPR)预测
我来帮你一步步完成这个多输出GPR的预测任务,从数据准备到建模预测全流程走一遍:
1. 导入依赖与整理训练数据
首先得把需要的库和你给出的训练数据准备好:
import numpy as np from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C from sklearn.multioutput import MultiOutputRegressor # 二维笛卡尔坐标训练样本 x_train = np.array([[0,0],[2,2],[3,3]]) # 对应每个输入点的3个数据源观测输出(3个输出维度) y_train = np.array([[200,250, 155],[321,345,210],[417,445,851]])
这里要注意:你的y_train是(3,3)的形状,属于多输出回归任务,所以需要用MultiOutputRegressor包装基础GPR模型,让它能同时处理3个输出维度的预测。
2. 初始化多输出GPR模型
先选一个常用的核函数(也可以根据数据特性调整),再初始化适配多输出的GPR模型:
# 定义核函数:常数核 * RBF核,参数范围可根据数据调整 kernel = C(1.0, (1e-3, 1e3)) * RBF(1.0, (1e-2, 1e2)) # 初始化单输出GPR,多次重启优化器避免局部最优 single_gpr = GaussianProcessRegressor( kernel=kernel, n_restarts_optimizer=10, random_state=42 ) # 用MultiOutputRegressor包装,适配多输出场景 multi_gpr = MultiOutputRegressor(single_gpr)
3. 训练模型并处理测试点
先训练模型,再把你给出的xvalues和yvalues转换成模型需要的二维测试点格式:
# 训练多输出GPR模型 multi_gpr.fit(x_train, y_train) # 生成二维测试网格点(你给出的x/y值范围) xvalues = np.array([0,1,2,3]) yvalues = np.array([0,1,2,3]) X_test_grid, Y_test_grid = np.meshgrid(xvalues, yvalues) # 转换成模型要求的(n_samples, 2)格式 x_test = np.column_stack((X_test_grid.ravel(), Y_test_grid.ravel()))
这样x_test就包含了4x4共16个二维测试点,和训练数据的格式完全匹配。
4. 预测均值、标准差与方差
调用predict方法时设置return_std=True,就能直接获取每个输出维度的预测标准差,方差则是标准差的平方:
# 预测均值和标准差 y_pred_mean, y_pred_std = multi_gpr.predict(x_test, return_std=True) # 计算方差 y_pred_var = y_pred_std ** 2 # 可选:把结果还原成网格形状,方便后续分析/可视化 y_pred_mean_grid = y_pred_mean.reshape(X_test_grid.shape[0], X_test_grid.shape[1], 3) y_pred_std_grid = y_pred_std.reshape(X_test_grid.shape[0], X_test_grid.shape[1], 3) y_pred_var_grid = y_pred_var.reshape(X_test_grid.shape[0], X_test_grid.shape[1], 3)
y_pred_mean是(16,3)的数组:每一行对应一个测试点的3个数据源预测均值y_pred_std是(16,3)的数组:对应每个预测值的标准差y_pred_var是(16,3)的数组:对应每个预测值的方差
如果你的测试点不是网格,而是单个特定点(比如[[1,1]]),直接传入predict方法即可,不需要用meshgrid处理。
内容的提问来源于stack exchange,提问作者santobedi
相关产品推荐
相关产品推荐

