无迭代scipy.OPT大小当试图最小化函数时

2024-10-01 13:24:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用scipy通过使用'minimize'from使似然函数最大化scipy.optimize公司使函数值的负值最小化。我用BFGS方法,写了似然函数及其一阶导数。在

我已经能够通过数值估计梯度来最小化函数(不提供jacobian的参数)。然而,当我试图将渐变函数作为参数传递时,不会执行迭代来改进我对函数输入值的初始猜测。在

编辑:使用scipy的check_grad,我发现我的梯度函数有缺陷。这将导致第一次迭代的行搜索步骤失败,因此不执行迭代。在

函数和梯度如下:

def f(X):
    X = X.reshape((N,Q))
    cov = kern2.compute_noisy(X,X)
    inv_cov = np.linalg.inv(cov)
    YYt = np.dot(Y, Y.T)
    log_l = (-0.5*D*N*np.log(2*math.pi))-(0.5*D*np.log(np.linalg.det(cov))) - (0.5*np.matrix.trace(np.dot(inv_cov,YYt)))
    return -log_l

def grad(X):
    X = X.reshape(N,-1)
    cov = kern2.compute_noisy(X,X)
    inv_cov = np.linalg.inv(cov)
    YYt = np.dot(Y, Y.T)
    dlogl_dK = np.dot(np.dot(inv_cov,YYt),inv_cov) - D*inv_cov
    dK_dX = np.empty((X.shape[0], X.shape[0], X.shape[1]))
    Q = int(X.shape[1])
    for j in range(0,X.shape[0]):
        for i in range(0,X.shape[0]):
            for k in range(0,X.shape[1]):
                dK_dX[i,j,k] = (X[i][k] - X[j][k]) * kern.K(X[i,:][None],X[j,:][None])
    dK_dX = np.sum(dK_dX, axis=1)
    dlogl_dX = np.dot(dlogl_dK, dK_dX)
    return -dlogl_dX.flatten(1)

检查初始函数值:

^{pr2}$

从数值上估计梯度似乎是可以的(函数没有最小化,但至少发生了一些事情)。X是我对输入的最初猜测:

from scipy.optimize import minimize
test = minimize(f, X, method='BFGS', options={'disp': True})

>>Warning: Desired error not necessarily achieved due to precision loss.
>>     Current function value: 6215.446492
>>     Iterations: 289
>>     Function evaluations: 67671
>>     Gradient evaluations: 335

这就是当我试图包含梯度函数时发生的情况。不执行迭代且函数值不变:

test2 = minimize(f, X, method='BFGS', jac=grad, options={'disp': True})

>>Warning: Desired error not necessarily achieved due to precision loss.
>>     Current function value: 6597.801988
>>    Iterations: 0
>>     Function evaluations: 43
>>     Gradient evaluations: 32

我看了文档,不明白为什么没有执行迭代。我认为我正确地使用了minimize,我不认为我的初始猜测已经达到了最小值,因为我在不同的值集上有相同的问题。我们将非常感谢您的帮助!在


Tags: 函数lognpscipycovdot梯度dk