0

Ich versuche fmin_ncg zu verwenden, um meine Kostenfunktion zu minimieren. Aber die Ergebnisse, die ich zurückbekomme, werden nicht minimiert. Ich bekomme das gleiche Ergebnis ohne erweiterte Optimierung. Ich weiß, dass es weiter minimiert werden kann.fmin_ncg liefert kein optimiertes Ergebnis

PS. Ich versuche, Aufgabe 2 der Coursera's ML course zu codieren.

Meine Kosten fn:

[[ 1.00000000e+00 5.12670000e-02 6.99560000e-01 ..., 6.29470940e-04 
8.58939846e-03 1.17205992e-01] 
[ 1.00000000e+00 -9.27420000e-02 6.84940000e-01 ..., 1.89305413e-03 
    -1.39810280e-02 1.03255971e-01] 
[ 1.00000000e+00 -2.13710000e-01 6.92250000e-01 ..., 1.04882142e-02 
    -3.39734512e-02 1.10046893e-01] 
..., 
[ 1.00000000e+00 -4.84450000e-01 9.99270000e-01 ..., 2.34007252e-01 
    -4.82684337e-01 9.95627986e-01] 
.... 

Y ist ein Bündel von 0 und 1

[[1] 
[1] 
[1] 
[1] 
... 
[0] 
[0]] 

X.shape = (118, 28) 
y.shape = (118, 1) 

Meine grad Funktion:

def costFn(theta, X, y, m, lam): 
    h = sigmoid(X.dot(theta)) 
    theta0 = theta 
    J = 1/m * np.sum((-(y * np.log(h))) - ((1-y) * np.log(1-h))) + (lam/(2*m) * theta0.T.dot(theta0)) 
    return J.flatten() 

X wie folgt aussehen würde

def grad(theta, X, y, m, lam): 
    h = sigmoid(X.dot(theta)) 
    theta0 = initial_theta 
    gg = 1.0/m * ((X.T.dot(h-y)) + (lam * theta0)) 
    return gg.flatten() 

Mit nur meine costFn und grad, erhalte ich folgendes:

Cost at initial theta (zeros): 0.69314718056 

Mit fmin_ncg:

xopt = fmin_ncg(costFn, fprime=grad, x0=initial_theta, args=(X, y, m, lam), maxiter=400, disp=True, full_output=True) 

ich:

Optimization terminated successfully. 
    Current function value: 0.693147 
    Iterations: 1 
    Function evaluations: 2 
    Gradient evaluations: 4 
    Hessian evaluations: 0 

Mit Oktave, mein J nach erweiterte Optimierung sollte sein:

0.52900 

Was mache ich falsch?


EDIT: habe ich meine Optimierung zu arbeiten:

y1 = y.flatten() 
Result = op.minimize(fun = costFn, 
       x0 = initial_theta, 
       args = (X, y1, m, lam), 
       method = 'CG', 
       options={'disp': True}) 

ich die costFn 0,52900 sein zu bekommen, das ist, was ich erwartet hatte.

Aber die Werte von 'Theta' sind ein bisschen, dass die Genauigkeit nur 42% ist. Es soll 83% sein.

Die Werte von Theta bekam ich:

[ 1.14227089 0.60130664 1.16707559 -1.87187892 -0.91534354 -1.26956697 
0.12663015 -0.36875537 -0.34522652 -0.17363325 -1.42401493 -0.04872243 
-0.60650726 -0.269242 -1.1631064 -0.24319088 -0.20711764 -0.04333854 
-0.28026111 -0.28693582 -0.46918892 -1.03640373 0.02909611 -0.29266766 
0.01725324 -0.32899144 -0.13795701 -0.93215664] 

Die tatsächlichen Werte:

[1.273005 0.624876 1.177376 -2.020142 -0.912616 -1.429907 0.125668 -0.368551 
-0.360033 -0.171068 -1.460894 -0.052499 -0.618889 -0.273745 -1.192301 
-0.240993 -0.207934 -0.047224 -0.278327 -0.296602 -0.453957 -1.045511 
0.026463 -0.294330 0.014381 -0.328703 -0.143796 -0.924883] 

Antwort

1

allererst dem Farbverlauf

def grad(theta, X, y, m, lam): 
    h = sigmoid(X.dot(initial_theta)) 
    theta0 = initial_theta 
    gg = 1/m * ((X.T.dot(h-y)) + (lam * theta0)) 
    return gg.flatten() 

diese Funktion ungültig ist nie benutzt Theta , setzen Sie stattdessen initial_theta, was falsch ist ect.

ähnliche Fehler in den Kosten

def costFn(theta, X, y, m, lam): 
    h = sigmoid(X.dot(initial_theta)) 
    theta0 = theta 
    J = 1/m * np.sum((-(y * np.log(h))) - ((1-y) * np.log(1-h))) + (lam/(2*m) * theta0.T.dot(theta0)) 
    return J.flatten() 

Sie haben einige seltsame Mischung aus theta und initial_theta, die nicht auch sinnvoll, sollten es innerhalb nur theta sein.Als eine Nebenbemerkung - es sollte keine Notwendigkeit zur Abflachung geben, sollte Ihre Kostenfunktion ein Skalar sein, also wenn Sie flattern müssen - etwas ist falsch in Ihren Berechnungen.

Auch eine Überprüfung lohnt - was ist Ihre m? Wenn es eine Ganzzahl ist und Sie Python 2.X verwenden, ist 1/m gleich Null, da es Integer-Division ist. Sie sollten stattdessen 1.0/m tun. (in beiden Funktionen)

+0

Ich korrigierte die grad() und constFn(), um 'Theta' und nicht 'initial_theta' zu haben. Es gelang mir, die Optimierung zu erhalten, um ein optimiertes Costfn zurückzugeben, aber die Werte von Theta, die es zurückgibt, sind ein bisschen aus. Ich soll eine Genauigkeit von 83% bekommen, aber ich bekomme nur 42%! Siehe meine Bearbeitung! @lejlot –

Verwandte Themen