我正在使用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与用于生成实际数据的参数相同。那很棒。现在我的问题是:
我理解雅可比矩阵应该是m×n矩阵,其中m是来自X输入的记录数,n是参数的数量。显然我在结果对象中没有这个。结果对象产生一个在文档中被称为雅可比行列式的数组(1和2),但它只是一维的,其中有许多元素等于参数的数量。
进一步混淆了这个问题,当我使用method ='SLSQP'时,返回的雅可比元素比其他最小化算法返回的元素多一个元素。
。 。 。
我在这里的更大目标是能够计算拟合参数的置信区间或标准误差,t-和p值,所以如果您认为我偏离此处,请告诉我。 / p>
编辑:
以下内容旨在说明SLSQP最小化算法如何在雅可比行列式中产生与默认最小化算法不同的结果,默认最小化算法是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求解器返回的雅可比阵列中有一个额外的元素。我很困惑这来自哪里。