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