我使用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,我不认为我的初始猜测已经达到了最小值,因为我在不同的值集上有相同的问题。我们将非常感谢您的帮助!在
目前没有回答
相关问题 更多 >
编程相关推荐