Ich versuche, die folgende Funktion mit scipy.optimize
zu minimieren:eine multivariate, differenzierbare Funktion minimiert wird mit scipy.optimize
, deren Steigung ist dies:
(für diejenigen, die daran interessiert sind, dies ist die Wahrscheinlichkeitsfunktion eines Bradley-Terry-Luce-Modells für paarweise Vergleiche. Sehr eng mit der logistischen Regression verbunden.)
Es ist ziemlich klar, dass das Hinzufügen einer Konstante zu allen Parametern den Wert der Funktion nicht ändert. Daher lasse ich \ theta_1 = 0. Hier sind die Umsetzung der Zielfunktionen und die Steigung in Python (Theta wird x
hier):
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
Hier ist ein Beispiel dafür, was cijs
aussehen könnte:
[[ 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]]
Dies ist der Code, den ich ausführen, um die Minimierung auszuführen:
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)
es ist jedoch nicht immer in der ersten Iteration:
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: 73.290610
Iterations: 0
Function evaluations: 38
Gradient evaluations: 27
Ich kann nicht herausfinden, warum es fehlschlägt. Der Fehler wird wegen dieser Zeile angezeigt:
So scheint diese "Wolfe Zeile Suche" nicht gelingen, aber ich habe keine Ahnung, wie Sie von hier aus fortfahren ... Jede Hilfe wird geschätzt!
Ihre Verlaufsfunktion ist wahrscheinlich falsch. Versuchen Sie, es gegen finite Unterschiede zu prüfen (z. B. mit [scipy.optimize.check_grad] (http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.optimize.check_grad.html)) –
@pv. Sie wetten;) Danke! – lum