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
相关产品推荐
相关产品推荐

