Tôi đang cố gắng để giảm thiểu các chức năng sau đây với scipy.optimize
:giảm thiểu một đa biến, chức năng vi sử dụng scipy.optimize
có độ dốc là thế này:
(cho những người quan tâm, đây là chức năng khả năng của mô hình Bradley-Terry-Luce để so sánh cặp đôi. Rất liên quan chặt chẽ với hồi quy logistic.)
Rõ ràng là việc thêm một hằng số vào tất cả các tham số sẽ không thay đổi giá trị của hàm. Do đó, tôi để cho \ theta_1 = 0. Dưới đây là việc thực hiện các chức năng khách quan và gradient trong python (theta trở thành x
đây):
def objective(x):
x = np.insert(x, 0, 0.0)
tiles = np.tile(x, (len(x), 1))
combs = tiles.T - tiles
exps = np.dstack((zeros, combs))
return np.sum(cijs * scipy.misc.logsumexp(exps, axis=2))
def gradient(x):
zeros = np.zeros(cijs.shape)
x = np.insert(x, 0, 0.0)
tiles = np.tile(x, (len(x), 1))
combs = tiles - tiles.T
one = 1.0/(np.exp(combs) + 1)
two = 1.0/(np.exp(combs.T) + 1)
mat = (cijs * one) + (cijs.T * two)
grad = np.sum(mat, axis=0)
return grad[1:] # Don't return the first element
Dưới đây là một ví dụ về những gì cijs
có thể trông giống như:
[[ 0 5 1 4 6]
[ 4 0 2 2 0]
[ 6 4 0 9 3]
[ 6 8 3 0 5]
[10 7 11 4 0]]
Đây là mã tôi chạy để thực hiện giảm thiểu:
x0 = numpy.random.random(nb_items - 1)
# Let's try one algorithm...
xopt1 = scipy.optimize.fmin_bfgs(objective, x0, fprime=gradient, disp=True)
# And another one...
xopt2 = scipy.optimize.fmin_cg(objective, x0, fprime=gradient, disp=True)
Tuy nhiên, nó luôn luôn thất bại trong phiên đầu tiên:
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: 73.290610
Iterations: 0
Function evaluations: 38
Gradient evaluations: 27
Tôi không thể hiểu tại sao nó không thành công. Lỗi được hiển thị vì dòng này: https://github.com/scipy/scipy/blob/master/scipy/optimize/optimize.py#L853
Vì vậy, "tìm kiếm đường Wolfe" này dường như không thành công, nhưng tôi không biết cách tiến hành từ đây ... Mọi trợ giúp đều được đánh giá cao!
Chức năng gradient của bạn có thể không chính xác. Hãy thử xác minh nó chống lại sự khác biệt hữu hạn (ví dụ: sử dụng [scipy.optimize.check_grad] (http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.optimize.check_grad.html)) –
@pv. Bạn đặt cược;) Cảm ơn! – lum