【问题标题】:fmin_ncg not returning an optimized resultfmin_ncg 未返回优化结果
【发布时间】:2016-08-31 21:07:48
【问题描述】:

我正在尝试使用 fmin_ncg 来最小化我的成本函数。但是,我得到的结果并没有最小化。如果没有高级优化,我会得到相同的结果。我知道它可以进一步最小化。

PS。我正在尝试对Coursera's ML course 的分配 2 进行编码。

我的成本:

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 看起来像这样:

[[  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 是一堆 0 和 1

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

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

我的毕业功能:

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()

仅使用我的 costFn 和 grad,我得到以下信息:

Cost at initial theta (zeros): 0.69314718056

使用 fmin_ncg:

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

我明白了:

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

使用八度,我的高级优化后的J应该是:

 0.52900

我做错了什么?


编辑: 我得到了优化:

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

我得到 costFn 为 0.52900,这是我的预期。

但 'theta' 的值有点偏离,准确度仅为 42%。应该是 83%。

我得到的 theta 值:

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

实际值:

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

【问题讨论】:

    标签: python machine-learning octave jupyter logistic-regression


    【解决方案1】:

    首先你的渐变是无效的

    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()
    

    这个函数从不使用theta,你用initial_theta代替,这是不正确的。

    成本上的类似错误

    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()
    

    你有一些 thetainitial_theta 的奇怪组合,这也没有意义,里面应该只有 theta。作为旁注 - 不需要展平,您的成本函数应该是标量,因此如果您必须展平 - 您的计算中有问题。

    还值得检查 - 你的m 是什么?如果它是一个整数,并且您使用的是 python 2.X,那么 1 / m 等于 ,因为它是 整数除法。你应该改用1.0 / m。 (在两个函数中)

    【讨论】:

    • 我将 grad() 和 constFn() 更正为具有 'theta' 而不是 'initial_theta'。我设法获得优化以返回优化的 costfn,但它返回的 theta 值有点偏离。我应该得到 83% 的准确率,但我只得到 42%!看我的编辑! @lejlot
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2014-06-29
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    相关资源
    最近更新 更多