1

で独自の Hessian を指定するのに問題がありscipy.optimize.minimizeます。ダブルチェックするために最小限の問題を作成しましたが、それを機能させることもできません。誰かがたまたま問題が何であるかを知っていますか?

これが私の例です:

import numpy as np 
import jax.numpy as jnp 
import scipy

from scipy.optimize import minimize 
from scipy.optimize import NonlinearConstraint

from jax import grad, jit, vmap, jacrev, hessian
    
size_overall = 4 

constr_size= size_overall 

x0 = np.dot(2,np.ones((size_overall)))

def cost_func(x):    
    return jnp.dot(x,x)

def cost_func_grad(x):   
    return jnp.dot(2,x)

def test(x):     
    return x-np.ones(constr_size)

def jac_func(x):    
    return np.array(jacrev(test)(x0))

def hess_func(x,v): 
    temp = hessian(test)(x0)    

    temp0 = temp[0]     
    for i in range(0,constr_size):  
        temp0 = np.concatenate((temp0,temp[i])) 

    return temp0

print(hess_func(x0,0)) 
print(hess_func(x0,0).shape)


nonlinear_constraint = NonlinearConstraint(test,np.size(constr_size),np.size(constr_size),jac_func,hess_func)

res2 = minimize(cost_func, x0, method='trust-constr', jac=cost_func_grad,
            constraints=[nonlinear_constraint], options={'disp': True})
4

1 に答える 1

0

答えについては、上記の私のコメントを参照してください。

これは問題を解決するようです:

def hess_func(x,v): 
    temp = hessian(test)(x0)    
    temp0 = v[0]*temp[0]
    for i in range(1,constr_size):
        temp0 = temp0 + v[i]*temp[i]
    return temp0

print(hess_func(x0,np.zeros((constr_size)))) 
print(hess_func(x0,np.zeros((constr_size))).shape)

必要なヘッセ行列の形状がヘッセ行列自体の標準定義とは異なり、H(x,v) が実際には合計であるためだと思います。https ://docs.scipy.org/doc/scipy を参照してください。 /reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize .

于 2021-07-26T22:06:42.200 に答える