You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多维数据下高斯过程模型拟合结果的可视化方法咨询

可视化二维输入+二维输出高斯过程拟合结果的实用方法

嘿,我明白你现在的困境——二维输入、二维输出的GP拟合可视化确实比单维度场景麻烦不少,不过咱们有几个实用的办法可以试试,帮你直观看到模型的拟合效果:

1. 切片式可视化:固定一个输入维度,观察另一维度与输出的关系

这是最直观的入门方法,通过固定其中一个输入特征(比如x1)的取值,遍历另一个特征(x2)的范围,然后让GP预测对应的输出y1和y2,把结果绘制成曲线。你可以多选几个不同的x1固定值,生成子图对比,就能看到模型在不同输入切片上的拟合表现。

示例代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF

# 假设你已经训练好模型gpr,并有输入数据X (n_samples, 2),输出y (n_samples, 2)
# 生成测试切片:固定x1为几个不同值,遍历x2
x1_fixed_values = [np.percentile(X[:,0], 25), np.percentile(X[:,0], 50), np.percentile(X[:,0], 75)]
x2_range = np.linspace(X[:,1].min(), X[:,1].max(), 100)

fig, axes = plt.subplots(2, 3, figsize=(15, 10))
for i, x1_val in enumerate(x1_fixed_values):
    # 构造测试输入:固定x1,x2遍历
    X_test = np.array([[x1_val, x2] for x2 in x2_range])
    y_pred, y_std = gpr.predict(X_test, return_std=True)
    
    # 绘制y1的拟合曲线+置信区间
    axes[0, i].plot(x2_range, y_pred[:,0], label='Predicted y1')
    axes[0, i].fill_between(x2_range, y_pred[:,0]-2*y_std, y_pred[:,0]+2*y_std, alpha=0.2)
    # 叠加真实数据点(仅x1接近固定值的点)
    mask = np.isclose(X[:,0], x1_val, atol=0.1)
    axes[0, i].scatter(X[mask,1], y[mask,0], c='r', s=10, label='True y1')
    axes[0, i].set_title(f'x1 = {x1_val:.2f}')
    axes[0, i].legend()
    
    # 绘制y2的拟合曲线+置信区间
    axes[1, i].plot(x2_range, y_pred[:,1], label='Predicted y2')
    axes[1, i].fill_between(x2_range, y_pred[:,1]-2*y_std, y_pred[:,1]+2*y_std, alpha=0.2)
    axes[1, i].scatter(X[mask,1], y[mask,1], c='r', s=10, label='True y2')
    axes[1, i].legend()

axes[0,0].set_ylabel('y1')
axes[1,0].set_ylabel('y2')
plt.tight_layout()
plt.show()

2. 真实输出vs预测输出的散点对比

这个方法能快速帮你评估模型的整体拟合精度:分别把y1的真实值和预测值、y2的真实值和预测值绘制成散点图,再加上一条对角线(代表完美拟合)。如果大部分点都靠近对角线,说明模型拟合效果不错。

示例代码:

# 用全部训练/测试数据预测
y_pred_all = gpr.predict(X)

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# y1真实vs预测
ax1.scatter(y[:,0], y_pred_all[:,0], alpha=0.6)
ax1.plot([y[:,0].min(), y[:,0].max()], [y[:,0].min(), y[:,0].max()], 'k--')
ax1.set_xlabel('True y1')
ax1.set_ylabel('Predicted y1')
ax1.set_title('y1: True vs Predicted')

# y2真实vs预测
ax2.scatter(y[:,1], y_pred_all[:,1], alpha=0.6)
ax2.plot([y[:,1].min(), y[:,1].max()], [y[:,1].min(), y[:,1].max()], 'k--')
ax2.set_xlabel('True y2')
ax2.set_ylabel('Predicted y2')
ax2.set_title('y2: True vs Predicted')

plt.tight_layout()
plt.show()

3. 输入空间的向量场/热图可视化

如果你的GP是用来学习坐标转换(输入到输出的空间映射),向量场是绝佳的选择:在输入空间生成网格点,用GP预测每个网格点的输出,然后绘制从输入坐标指向预测输出坐标的箭头,直观展示整个空间的变换趋势。

示例代码:

# 生成输入空间的网格
x1_grid, x2_grid = np.meshgrid(
    np.linspace(X[:,0].min(), X[:,0].max(), 20),
    np.linspace(X[:,1].min(), X[:,1].max(), 20)
)
X_grid = np.column_stack([x1_grid.ravel(), x2_grid.ravel()])

# 预测网格点的输出
y_pred_grid = gpr.predict(X_grid)
y_pred_grid = y_pred_grid.reshape(x1_grid.shape + (2,))

# 绘制向量场
fig, ax = plt.subplots(figsize=(8, 8))
# 计算向量:输出 - 输入
dx = y_pred_grid[:,:,0] - x1_grid
dy = y_pred_grid[:,:,1] - x2_grid
ax.quiver(x1_grid, x2_grid, dx, dy, angles='xy', scale_units='xy', scale=1, alpha=0.7)
# 叠加真实数据点
ax.scatter(X[:,0], X[:,1], c='r', s=20, label='Input points')
ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_title('Input → Predicted Output Vector Field')
ax.legend()
plt.axis('equal')
plt.show()

你也可以单独绘制y1或y2在输入空间的热图,用plt.imshow展示输出维度的分布规律。

4. 降维可视化(可选)

如果想一次性观察输入、真实输出、预测输出的整体分布关系,可以用PCA把输入(2D)、真实输出(2D)、预测输出(2D)都降到2D或3D空间,然后用不同颜色区分真实和预测的点,看它们的聚类重合度。

示例代码:

from sklearn.decomposition import PCA

# 合并输入、真实输出、预测输出
all_data = np.vstack([X, y, y_pred_all])
# 用PCA降维到2D
pca = PCA(n_components=2)
all_data_pca = pca.fit_transform(all_data)

# 提取各部分的降维结果
X_pca = all_data_pca[:len(X)]
y_true_pca = all_data_pca[len(X):2*len(X)]
y_pred_pca = all_data_pca[2*len(X):]

fig, ax = plt.subplots(figsize=(8, 8))
ax.scatter(X_pca[:,0], X_pca[:,1], c='gray', s=15, label='Input')
ax.scatter(y_true_pca[:,0], y_true_pca[:,1], c='blue', s=15, label='True Output')
ax.scatter(y_pred_pca[:,0], y_pred_pca[:,1], c='orange', s=15, alpha=0.6, label='Predicted Output')
ax.set_title('PCA: Input vs True/Predicted Output')
ax.legend()
plt.show()

你可以根据自己的核心需求选择合适的方法:如果想分析局部拟合细节,选切片可视化;如果想评估整体精度,用散点对比;如果关注空间变换效果,向量场是最佳选择~

内容的提问来源于stack exchange,提问作者Luca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:13:32