Python 3.x 如果目标函数返回一个范围内的和,那么如何使用minimize from scipy.optimizate输入子范围相关的雅可比矩阵?

Python 3.x 如果目标函数返回一个范围内的和,那么如何使用minimize from scipy.optimizate输入子范围相关的雅可比矩阵?,python-3.x,scipy,parameter-passing,mathematical-optimization,chaining,Python 3.x,Scipy,Parameter Passing,Mathematical Optimization,Chaining,假设一个人试图最小化给定的每个料仓的期望值和每个料仓的观察计数。在python语法中(假设期望值和观察计数的列表长度相等),卡方函数是 obs[i] are the observed counts in the i-th bin exp[i] are the expectation values of the i-th bin (obtained by integrating distribution function over bin bounds) chisquare = sum([( (o

假设一个人试图最小化给定的每个料仓的期望值和每个料仓的观察计数。在python语法中(假设期望值和观察计数的列表长度相等),卡方函数是

obs[i] are the observed counts in the i-th bin
exp[i] are the expectation values of the i-th bin (obtained by integrating distribution function over bin bounds)
chisquare = sum([( (obs[i] - exp[i])**2 / exp[i] ) for i in range(len(obs))])
在纸上,我知道如何计算卡方偏导数(wrt到每格观察计数和wrt到每格期望值)来计算雅可比矩阵

jaco = [( 2 * (obs[i] - 1) / exp[i] ), ( (exp[i]**2 - obs[i]**2)/exp[i] )]
如果考虑第i个料仓,则雅可比矩阵中所有其他料仓的项均为零

根据,

jac:bool或callable,可选 目标函数的雅可比(梯度)。仅适用于CG、BFGS、牛顿CG、L-BFGS-B、TNC、SLSQP、狗腿、信托ncg。如果jac是一个布尔值且为真,则假定fun随目标函数返回梯度。如果为False,将以数值方式估计梯度。jac也可以是返回目标梯度的可调用函数。在这种情况下,它必须接受与fun相同的参数

没有雅可比矩阵,我的代码是

from scipy.stats import chisquare
def argmin( args ):
    #argmin is the argument that is minimized by the function defined below
    # arg1 = mu
    # arg2 = sigma
    obsperbin = countperbin( numbins = numbins ) # pre-defined function (not shown)
    expperbin = expectperbin( numbins , args ) # pre-defined function (not shown)
    return chisquare(obsperbin, expperbin)

from scipy.optimize import minimize
def miniz( ):
    parameterguess = initial_params( ) # pre-defined function (not shown) that returns [mu, sigma]
    # [mu, sigma] of distribution used to generate initial guess of chi square value
    # looks for optimized values of [mu, sigma] that minimize chi square

    bnds = ((0.01, 10), (0.01, 1)) # ((bounds of mu), (bounds of sigma))
    globmin = minimize( argmin , parameterguess , method = 'L-BFGS-B', bounds = bnds, jac = jaco)

res = miniz()
print(res)

我的问题是雅可比矩阵依赖于箱子,而卡方值是所有箱子的总和。这是否意味着应该是最小化函数中的一个参数的雅可比矩阵应该是每个箱子上每个雅可比矩阵的和?或者每个迭代都有一个数组?如何将雅可比矩阵作为参数输入到最小化函数中

首先,我认为你的卡方梯度错了。您不能区分观察到的计数和预期计数,而是区分
mu
sigma
。观察到的部分保持不变,在最小化过程中,预期部分可能会发生变化(通过其对μ和σ的依赖性)。我认为我的方法仍然适用,但如果我错了,请纠正我。被最小化的对象在理想情况下是卡方的,这取决于每格观察到的常数和可变的预期计数。通过使每个料仓的预期计数依赖于args
mu
sigma
,我的代码在找到使卡方最小化的每个料仓的预期计数时隐式地传递了它们。即使观察到的每箱计数是恒定的,扩展卡方公式的平方差也会产生一个表达式
f
f
偏导数中的系数包括0-2度的观测计数。当然,关于μ和σ的偏导数包括一个
o
(观测计数)项。我想说的是,你需要区分你正在优化的变量(μ,sigma),而不是
o
e
(预期计数)。在这种情况下,
o
的偏导数是绝对没有意义的。这样看:
minimize
例程通过将不同的(mu,lambda)点传递给
argmin
函数,然后改变(mu,lambda),使得
argmin
的函数值尽可能小。如果你想使用一个基于梯度的优化器,并且你自己也提供梯度函数,那么你的函数将被完全相同的(mu,lambda)调用传递到
argmin
的点,最小值期望
mu
sigma
方向上该点的斜率作为用户提供的
bac
函数的返回值。归还任何其他东西,你就会丢失。这是有道理的。我将尝试实现这一点,并在情况好转时进行更新。再次感谢!