执行approx_fprime时遇ValueError:用序列设置数组元素
解决scipy.optimize.approx_fprime中的ValueError: setting an array element with a sequence错误
你遇到的这个错误核心原因很明确:scipy.optimize.approx_fprime要求目标函数必须返回标量值,但你最初定义的J(x)函数返回的是一个数组,这和它的预期输入输出不匹配。
原代码的问题分析
来看你最初的函数:
def J(x): return x*x
当你传入xk.ravel()(一个长度为9的一维数组)时,x*x会执行元素级别的乘法,返回一个同样长度的数组,而不是单个数值。approx_fprime在计算数值梯度时,需要对每个维度的参数做微小扰动,然后计算函数输出的差分——如果函数返回的是数组,它无法完成这个差分计算,因此抛出ValueError。
修正方案
你自己已经找对了正确的方向:把目标函数修改为返回标量。修正后的函数用np.sum(x**2)对所有元素的平方求和,确保无论输入的一维数组长度是多少,最终返回的都是单个数值:
def J(x): return np.sum(x**2)
完整修正代码
import numpy as np import scipy.optimize as op def J(x): return np.sum(x**2) xk = np.arange(1,10).reshape(3,3).astype('float32') print(op.approx_fprime(xk.ravel(), J, 0.01))
运行这段代码后,你会得到近似的梯度值,对于J(x)=sum(x²)这个函数来说,理论梯度是2x,所以输出结果会和2*xk.ravel()非常接近(由于使用了0.01的扰动步长,会存在微小的数值误差)。
内容的提问来源于stack exchange,提问作者j35t3r
相关产品推荐
相关产品推荐

