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是参数数。显然,结果对象中没有该对象。结果对象产生一个数组,该数组在文档(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)
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数组中还有一个额外的元素。我对此感到困惑。
| 归档时间: |
|
| 查看次数: |
1191 次 |
| 最近记录: |