运行scipy的BFGS优化算法时出现ValueError错误是什么原因?
Scipy optimize.minimize BFGS方法报错原因分析
- 核心触发原因:
scipy.optimize.minimize要求传入的目标函数必须返回单个标量值,你当前代码运行时目标函数返回的是长度为5的numpy数组,不符合接口要求。
原因拆解
你传入的初始值x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])是长度为5的一维数组,minimize在迭代过程中每次传给目标函数f的输入x都是和x0形状一致的(5,)数组。你当前定义的f(x) = (x-2)**2 + 2是逐元素计算逻辑,输入为长度5的数组时,输出也是长度5的数组,不是单值标量,因此触发了报错。
对应解决方法
场景1:你原本要优化单变量函数
仅需修改初始值为单值或长度为1的数组即可:
x0 = np.array([1.3]) res = minimize(f, x0, method='BFGS', options={'disp': True})
运行后会得到预期的最小值点x=2,对应函数值为2。
场景2:你需要优化5维变量的目标函数
修改目标函数,将多维度的计算结果汇总为单个标量即可,比如对各维度的计算结果求和:
import numpy as np def f(x): return np.sum((x - 2)**2) + 2
修改后调用原有minimize代码即可正常运行,最终得到的最优解每个维度都会趋近于2,对应函数值为2。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

