繁体   English   中英

scipy.optimize.minimize:一起计算粗麻布和渐变

[英]scipy.optimize.minimize : compute hessian and gradient together

scipy.optimize.minimize函数基本上实现了MATLAB的'fminunc'函数,用于查找函数的局部最小值。

在scipy中,渐变和Hessian的函数是分开的。

res = minimize(rosen, x0, method='Newton-CG',
...                jac=rosen_der, hess=rosen_hess,
...                options={'xtol': 1e-30, 'disp': True})

但是,我有一个函数,其Hessian和渐变共享相当多的计算,我想一起计算Hessian和渐变,以提高效率。 在fminunc中,可以编写目标函数以返回多个值,即:

function [ q, grad, Hessian ] = rosen(x)

有没有一种方法可以将函数传递给可以一起计算这些元素的scipy.optimize.minimize?

您可以使用缓存解决方案,但是第一个numpy数组不可清除,其次您只需要缓存一些值,具体取决于算法是否在x上来回反复。 如果算法只从一个点移动到下一个点,你可以用这种方式只缓存最后一个计算点,你的f_hesf_jac只是lambda接口到更长的函数计算:

import numpy as np

# I choose the example f(x,y) = x**2 + y**2, with x,y the 1st and 2nd element of x below:
def f(x):
    return x[0]**2+x[1]**2

def f_jac_hess(x):
    if all(x==f_jac_hess.lastx):
        print('fetch cached value')
        return f_jac_hess.lastf
    print('new elaboration')
    res = array([2*x[0],2*x[1]]),array([[2,0],[0,2]])

    f_jac_hess.lastx = x
    f_jac_hess.lastf = res

    return res

f_jac_hess.lastx = np.empty((2,)) * np.nan

f_jac = lambda x : f_jac_hess(x)[0]
f_hes = lambda x : f_jac_hess(x)[1]

现在第二个调用将缓存保存的值:

>>> f_jac([3,2])
new elaboration
Out: [6, 4]
>>> f_hes([3,2])
fetch cached value
Out: [[2, 0], [0, 2]]

然后将其称为:

minimize(f,array([1,2]),method='Newton-CG',jac = f_jac, hess= f_hes, options={'xtol': 1e-30, 'disp': True})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM