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

使用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)

此时你会看到:

  1. 两种情况都能成功收敛到Rosenbrock函数的最小值点x=[1,1]
  2. 提供自定义雅可比的版本,nfev(函数评估次数)和njev(雅可比评估次数)会显著减少——因为优化器不需要再用数值方法近似雅可比,直接用你提供的解析雅可比,计算效率和精度都会提升

提供雅可比矩阵的核心意义

  • 提升计算效率:数值近似雅可比需要多次调用目标函数,解析雅可比只需一次计算,变量或残差数量越多,效率提升越明显
  • 提高优化精度:数值近似会引入截断误差,解析雅可比能提供更准确的梯度信息,帮助优化器更快找到最优解
  • 适配特殊场景:某些复杂函数的数值雅可比计算不稳定,解析雅可比能避免这种问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:43:13