使用scipy.optimize.least_squares时,提供雅可比矩阵未提升优化效果?
关于scipy.optimize.least_squares中提供雅可比矩阵的意义疑问
我针对Rosenbrock函数,尝试用scipy.optimize.least_squares分别在提供和不提供雅可比矩阵的情况下做优化。原本以为提供雅可比能提升计算效果,但实际两者结果完全一致,想知道提供雅可比矩阵的意义何在?
我的测试代码如下:
import numpy as np from scipy.optimize import least_squares import pandas as pd def fun_rosenbrock(x): return 10 * (x[1] - x[0]**2)**2 + (1 - x[0])**2 #return np.array([10 * (x[1] - x[0]**2), (1 - x[0])]) def jac_rosenbrock(x): return np.array([ 40 * x[0] ** 3 - 40 * x[0] * x[1] + 2 * x[0] - 2, -20 * x[0] ** 2 + 20 * x[1] ]) x0_rosenbrock = np.array([20, 20]) res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac_rosenbrock) print(res_1) print(res_2)
两种情况的输出结果一致,示例输出如下:
active_mask: array([0., 0.]) cost: 444.17831429066666 fun: array([29.80531209]) grad: array([77.13171789, 45.15551332]) jac: array([[2.58785138, 1.51501562]]) message: 'The maximum number of function evaluations is exceeded.' nfev: 200 njev: 194 optimality: 77.13171788839948 status: 0 success: False x: array([-4.45416634, 19.91534845])
问题根源:目标函数定义不符合工具要求
scipy.optimize.least_squares是专门用来最小化残差平方和的工具,它要求目标函数fun返回的是残差数组,而非直接返回平方和结果。你当前的fun_rosenbrock返回的是Rosenbrock函数的最终值(平方和),这会让优化器把这个单值当成唯一残差,不仅优化过程无法正确收敛(从输出的success: False和耗尽评估次数的提示能看出),雅可比矩阵的作用也被完全限制了。
修正代码后再看雅可比的作用
把fun_rosenbrock改成返回残差数组,同时修正雅可比矩阵为残差的雅可比(而非原函数的梯度):
import numpy as np from scipy.optimize import least_squares def fun_rosenbrock(x): return np.array([10 * (x[1] - x[0]**2), (1 - x[0])]) # 返回残差数组 def jac_rosenbrock(x): # 残差的雅可比矩阵,形状为(残差数, 变量数) return np.array([ [-20 * x[0], 10], [-1, 0] ]) x0_rosenbrock = np.array([20, 20]) res_1 = least_squares(fun_rosenbrock, x0_rosenbrock) res_2 = least_squares(fun_rosenbrock, x0_rosenbrock, jac=jac_rosenbrock) print("无自定义雅可比的结果:") print(res_1) print("\n有自定义雅可比的结果:") print(res_2)
此时你会看到:
- 两种情况都能成功收敛到Rosenbrock函数的最小值点
x=[1,1] - 提供自定义雅可比的版本,
nfev(函数评估次数)和njev(雅可比评估次数)会显著减少——因为优化器不需要再用数值方法近似雅可比,直接用你提供的解析雅可比,计算效率和精度都会提升
提供雅可比矩阵的核心意义
- 提升计算效率:数值近似雅可比需要多次调用目标函数,解析雅可比只需一次计算,变量或残差数量越多,效率提升越明显
- 提高优化精度:数值近似会引入截断误差,解析雅可比能提供更准确的梯度信息,帮助优化器更快找到最优解
- 适配特殊场景:某些复杂函数的数值雅可比计算不稳定,解析雅可比能避免这种问题
内容的提问来源于stack exchange,提问作者HAL
相关产品推荐
相关产品推荐

