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

Botorch中Ackley合成函数绘图问题求助

解决Botorch Ackley函数绘图时的形状不匹配问题

问题根源

Botorch的合成测试函数(如Ackley)要求输入张量的形状为**(n_samples, dim)**,其中dim是函数的维度(Ackley默认是2维)。你当前代码将[X,Y]转为张量后,形状是(2, N, N),与函数期望的输入格式不匹配——只有当N=2时碰巧能运行,点数增加就会触发形状不匹配错误。

关于输入两个张量仅返回一个值:这类函数的设计逻辑是每个输入是一个d维样本点,函数对每个样本点输出一个标量值。你之前传入的张量格式不符合要求,导致输出形状异常,无法匹配绘图需求。

修正后的代码

import numpy as np
import torch
import matplotlib.pyplot as plt
import botorch.test_functions.synthetic as funcs

# 初始化2维Ackley函数
ackley = funcs.Ackley()

# 生成网格点,可自定义点数(示例用20)
x1 = np.linspace(0, 5, 20)
x2 = np.linspace(0, 5, 20)
X, Y = np.meshgrid(x1, x2)

# 转换为Botorch要求的输入格式:(n_samples, 2)
X_flat = X.flatten()
Y_flat = Y.flatten()
input_tensor = torch.tensor(np.column_stack((X_flat, Y_flat)), dtype=torch.float32)

# 计算函数值并重塑回网格形状
Z = ackley(input_tensor).reshape(X.shape)

# 绘制3D曲面
fig, ax = plt.subplots(subplot_kw={'projection':'3d'})
surf = ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()

关键要点

  • 输入格式适配:meshgrid生成的二维网格需先展平为一维数组,再拼接成(N*N, 2)的张量,这是Botorch合成函数的标准输入格式。
  • 输出形状匹配:函数返回的(N*N,)形状张量,需用reshape(X.shape)转回与X、Y一致的二维形状,才能被plot_surface正确识别。
  • 通用兼容性:该方法同样适用于Branin、Hartmann等其他Botorch合成函数,只需根据函数维度调整输入张量的列数即可(例如Hartmann默认6维,若要绘图需选取其中两个维度进行可视化)。

内容的提问来源于stack exchange,提问作者David Siret Marquês

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:48:13