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]
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 –