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

scipy least_squares生成的Jacobian矩阵符号与手算相反的原因

关于scipy.optimize.least_squares Jacobian矩阵符号差异的问题

我正在使用scipy.optimize.least_squares进行最小二乘优化,尝试手动推导该工具的各类输出结果。在计算Jacobian矩阵时,我手动得到的结果均为正值,但Python返回的Jacobian矩阵对应值却为负值,二者的数值大小完全一致。请问是什么原因导致了这种符号差异?

测试代码

import numpy as np
from scipy.optimize import least_squares
import pandas as pd
from sympy import Matrix, pprint
import matplotlib.pyplot as plt

# Define your model function
def model_func(x, params):
    return params[0] * x ** 2 + params[1] * x + params[2]
    
# Define the function to compute the residuals
def residuals(params, x_data, y_data):
    return y_data - model_func(x_data, params)
    
# Sample data
x_data = np.array([1, 2, 3, 4, 5])
y_data = np.array([2, 4, 9, 16, 25])

# Initial guess for parameters
initial_params = [1, 1, 1]

# Perform the least squares optimization
result = least_squares(residuals, initial_params, args=(x_data, y_data))

# Results
x = result.x # Optimized parameters
resnorm = result.cost # Sum of residuals squared
residual = result.fun # Array of residuals
exitflag = result.status # Status of the solver
output = result.message # Description of the cause of the termination
jacobian = result.jac # Jacobian matrix at the solution

print("Optimized parameters:", x)
print("Residual norm:", resnorm)
print("Residuals:", residual)
print("Exit flag:", exitflag)
print("Output message:", output)
print("Jacobian:", jacobian)

结果差异

运行上述代码后,返回的Jacobian矩阵所有元素均为负值;而手动计算得到的Jacobian矩阵所有元素均为正值,二者绝对值完全相同。

原因解析

符号差异的核心是残差函数定义与偏导数计算方向的不同:

  • 你定义的残差函数为:residuals = y_data - model_func(观测值减去模型预测值)
  • scipy.optimize.least_squares返回的Jacobian矩阵,是残差函数对优化参数的偏导数矩阵,即每个元素为 ∂residual_i / ∂param_j
  • 你手动计算时,大概率直接求解了模型预测值对参数的偏导数(∂model_func / ∂param_j),而根据残差函数的定义,偏导数满足:
    ∂residual_i / ∂param_j = ∂(y_data_i - model_func(x_i, params)) / ∂param_j = -∂model_func(x_i, params) / ∂param_j
    
    这就导致了两组结果符号完全相反、绝对值一致的现象。

以你的二次模型为例:

  • 模型对第一个参数params[0]的偏导数为x²(对应x_data的结果为[1,4,9,16,25],均为正)
  • 残差对params[0]的偏导数则为-x²(对应结果为[-1,-4,-9,-16,-25],均为负),与scipy返回的Jacobian第一列完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:34:52