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
这样会产生结果:
      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])
并且我们看到拟合的参数10,-32和15与用于生成实际数据的参数等效。那很棒。现在我的问题是:
我的理解是,雅可比行列式应该是一个mxn矩阵,其中m是X输入的记录数,n是参数数。显然,结果对象中没有该对象。结果对象产生一个数组,该数组在文档(1和2)中称为雅可比行列,但只有一维,且元素数等于参数数。
更令人困惑的是,当我使用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)
产量结果:
     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])
可以看到,从SLSQP解算器返回的Jacobian数组中还有一个额外的元素。我对此感到困惑。
| 归档时间: | 
 | 
| 查看次数: | 1191 次 | 
| 最近记录: |