了解scipy.optimize.minimize的Jacobian输出

khi*_*ner 5 minimize stderr scipy non-linear-regression

我正在使用scipy.optimize.minimize来查找自定义非线性函数的RSS最小值。我将提供一个简单的线性示例来说明我在做什么:

import numpy as np
from scipy import optimize

def response(X, b0, b1, b2):
    return b2 * X[1]**2 + b1 * X[0] + b0

def obj_rss(model_params, y_true, X):
    return np.sum((y_true - response(X, *model_params))**2)  

x = np.array([np.arange(0, 10), np.arange(10, 20)])
r = 15. * x[1]**2 - 32. * x[0] + 10.

init_guess = np.array([0., 50., 10.])
res = optimize.minimize(obj_rss, init_guess, args=(r, x))

print res
Run Code Online (Sandbox Code Playgroud)

这样会产生结果:

      fun: 3.0218799331864133e-08
 hess_inv: array([[  7.50606278e+00,   2.38939463e+00,  -8.33333575e-02],
       [  2.38939463e+00,   8.02462363e-01,  -2.74621294e-02],
       [ -8.33333575e-02,  -2.74621294e-02,   9.46969972e-04]])
      jac: array([ -3.31359843e-07,  -5.42022462e-08,   2.34304025e-08])
  message: 'Optimization terminated successfully.'
     nfev: 45
      nit: 6
     njev: 9
   status: 0
  success: True
        x: array([ 10.00066577, -31.99978062,  14.99999243])
Run Code Online (Sandbox Code Playgroud)

并且我们看到拟合的参数10,-32和15与用于生成实际数据的参数等效。那很棒。现在我的问题是:

我的理解是,雅可比行列式应该是一个mxn矩阵,其中m是X输入的记录数,n是参数数。显然,结果对象中没有该对象。结果对象产生一个数组,该数组在文档(12)中称为雅可比行列,但只有一维,且元素数等于参数数。

更令人困惑的是,当我使用method ='SLSQP'时,返回的雅可比行列式元素比其他最小化算法返回的元素多一个。

。。。

我在这里的更大目标是能够计算出拟合参数的置信区间或标准误差,t值和p值,因此,如果您认为我不在这里,请告诉我。

编辑:

以下内容旨在显示SLSQP最小化算法如何在Jacobian中产生与默认最小化算法不同的结果,默认最小化算法是BFGS,L-BFGS-B或SLSQP中的一种,具体取决于问题是否有约束(如文档)。SLSQP求解器旨在用于约束条件。

import numpy as np
from scipy import optimize


def response(X, b0, b1, b2):
    return b2 * X[1]**2 + b1 * X[0] + b0

def obj_rss(model_params, y_true, X):
    return np.sum((y_true - response(X, *model_params))**2)


x = np.array([np.arange(0, 10), np.arange(10, 20)])
r = 15. * x[1]**2 - 32. * x[0] + 10.

init_guess = np.array([0., 50., 10.])
res = optimize.minimize(obj_rss, init_guess, method='SLSQP', args=(r, x))

print res

r_pred = response(x, *res.x)
Run Code Online (Sandbox Code Playgroud)

产量结果:

     fun: 7.5269461938291697e-10
     jac: array([  2.94677643e-05,   5.52844499e-04,   2.59870917e-02,
         0.00000000e+00])
 message: 'Optimization terminated successfully.'
    nfev: 58
     nit: 10
    njev: 10
  status: 0
 success: True
       x: array([ 10.00004495, -31.9999794 ,  14.99999938])
Run Code Online (Sandbox Code Playgroud)

可以看到,从SLSQP解算器返回的Jacobian数组中还有一个额外的元素。我对此感到困惑。