通过scipy.stats.fit()从MLE检索优化结果?



我正在尝试通过scipy.stats."some_dist".fit()估计不同分布的参数,并且很难检索有关正在使用的优化过程的任何信息。具体来说,我正在寻找Hessian,它实现了大多数算法输出,如此处所述。

对于其所有优化,SciPy 返回一个名为OptimizeResult的对象,其中包含有用的信息,例如 Hessian,那么在.fit()一些调用相同优化的数据后如何获得这些信息?

看起来需要一些源代码潜水;幸运的是,它不需要复制大量源代码。这就是基本合身的工作原理:

from scipy.stats import cauchy
data = [0, 3, 4, 4, 5, 9]
res = cauchy.fit(data)   # (3.9798237305661255, 0.9205374643383732)

这就是修改它以返回优化结果的方式:

from scipy.optimize import minimize
args = cauchy._fitstart(data)
x0, func, restore, args = cauchy._reduce_func(args, {})
res = minimize(func, x0, args=(data,), method='BFGS')

现在res

fun: 14.337039523098689
hess_inv: array([[ 0.23321703, -0.0117229 ],
[-0.0117229 ,  0.36807373]])
jac: array([ 0.0000000e+00, -1.1920929e-07])
message: 'Optimization terminated successfully.'
nfev: 32
nit: 5
njev: 8
status: 0
success: True
x: array([3.9798262 , 0.92055376])

您可以在其中识别参数res.x.最小化的函数是"惩罚NNLF"(非负似然函数)。


顺便一提

对于其所有优化,SciPy 返回一个名为 OptimizeResult 的对象

是过度概括。对于minimize方法都是如此。默认情况下,scipy.stats.fit使用fmin,它不返回这样的东西。

因此,如果想要与fmin相同的输出,可以安排,但那里不会有额外的信息。

from scipy.optimize import fmin
args = cauchy._fitstart(data)
x0, func, restore, args = cauchy._reduce_func(args, {})
res = fmin(func, x0, args=(data,))
print(tuple(res))   #(3.9798237305661255, 0.9205374643383732)

minimize与method='Nelder-Mead'一起使用具有基本相同的效果。您确实会得到一些额外的信息,但鉴于该方法是基于单纯形的(不计算导数),此信息的用途有限。

res = minimize(func, x0, args=(data,), method='Nelder-Mead')
print(res)
print(tuple(res.x))

指纹

final_simplex: (array([[3.97982373, 0.92053746],
[3.97983057, 0.92060317],
[3.97977536, 0.92059568]]), array([14.33703952, 14.33703953, 14.33703953]))
fun: 14.337039523477827
message: 'Optimization terminated successfully.'
nfev: 58
nit: 31
status: 0
success: True
x: array([3.97982373, 0.92053746])
(3.9798237305661255, 0.9205374643383732)

最新更新