尝试最小化函数

时间:2016-03-16 15:13:06

标签: python scipy

我正在使用scipy来最大化似然函数,方法是使用scipy.optimize中的'minimize'来最小化函数值的负值。我正在使用BFGS方法,并为可能性及其一阶导数编写函数。

我已经能够通过数值估计梯度来最小化功能(不为雅可比提供参数)。但是,当我尝试将渐变函数作为参数传递时,不会执行任何迭代来改进我对函数输入值的初始猜测。

编辑:从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)

检查初始功能值:

print f(X)
>>6597.80198798

在数值上估计梯度似乎没问题(函数没有最小化,但至少发生了一些事情)。 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

我查看了文档,无法确定为什么没有执行迭代。我认为我正在使用最小化,我不认为我的初始猜测已经达到最小,因为我对不同的值集有相同的问题。非常感谢帮助!

0 个答案:

没有答案