【问题标题】:How to fix Value error reported when using optimize.minimize() but the function referenced has no error?如何修复使用 optimize.minimize() 但引用的函数没有错误时报告的值错误?
【发布时间】:2019-04-01 07:10:51
【问题描述】:

为了在逻辑回归中获得 Theta 的最佳值,我使用了 optimize.minimize() 函数,我的函数 costFunction(X,y,theta) 在给定 X,y 和 theta 值的情况下返回成本和梯度。我已经检查了我的函数 costFunction() 与初始值 theta 并且它工作正常。但是在 optimize.minimize() 中引用这个函数时,它会报告值错误。

这是我的 costFunction 代码以及我在哪里调用函数 optimize.minimize()

def costFunction(X,y,theta):
    J = 0.0
    m = Y.size
    J = -1/m * np.sum(((1-y)*np.log(1-sigmoid(np.dot(X,theta))))+((y)*np.log(sigmoid(np.dot(X,theta)))))
    grad = 1/m*np.dot(X.T,(sigmoid(np.dot(X,theta))-y))
    return J, grad ```

#To check the function :
print(X[:,:3].shape)
J,grad = costFunction(X[:,:3],Y,theta=[0,0,0])
print(J)
print( grad)

#and this returns the following output:
(1000, 3)
0.6931471805599454
[ 0.      17.25682  5.92721]

#and here's where I call optimize.minimize() function:
options = {'maxiter' : 400}
initial_theta = np.zeros(3)
x = X[:,:3]
#res = optimize.minimize(computeCost,initial_theta,(X[:,:3],Y),jac = True,method = 'TNC',options = options)
res = optimize.minimize(costFunction,
                        initial_theta,
                        (x, Y),
                        jac=True,
                        method='TNC',
                        options=options)

cost = res.fun
theta = res.x
print("cost ".cost)
print("theta ".theta)
#and it returns the following error :

ValueError                                Traceback (most recent call last)
<ipython-input-69-55576d96c00a> in <module>
      8                         jac=True,
      9                         method='TNC',
---> 10                         options=options)
     11 
     12 cost = res.fun

~/anaconda3/lib/python3.7/site-packages/scipy/optimize/_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    604     elif meth == 'tnc':
    605         return _minimize_tnc(fun, x0, args, jac, bounds, callback=callback,
--> 606                              **options)
    607     elif meth == 'cobyla':
    608         return _minimize_cobyla(fun, x0, args, constraints, **options)

~/anaconda3/lib/python3.7/site-packages/scipy/optimize/tnc.py in _minimize_tnc(fun, x0, args, jac, bounds, eps, scale, offset, mesg_num, maxCGit, maxiter, eta, stepmx, accuracy, minfev, ftol, xtol, gtol, rescale, disp, callback, **unknown_options)
    407                                         offset, messages, maxCGit, maxfun,
    408                                         eta, stepmx, accuracy, fmin, ftol,
--> 409                                         xtol, pgtol, rescale, callback)
    410 
    411     funv, jacv = func_and_grad(x)

~/anaconda3/lib/python3.7/site-packages/scipy/optimize/tnc.py in func_and_grad(x)
    369     else:
    370         def func_and_grad(x):
--> 371             f = fun(x, *args)
    372             g = jac(x, *args)
    373             return f, g

~/anaconda3/lib/python3.7/site-packages/scipy/optimize/optimize.py in __call__(self, x, *args)
     61     def __call__(self, x, *args):
     62         self.x = numpy.asarray(x).copy()
---> 63         fg = self.fun(x, *args)
     64         self.jac = fg[1]
     65         return fg[0]

<ipython-input-65-97115ec06e6e> in costFunction(X, y, theta)
      2     J = 0.0
      3     m = Y.size
----> 4     J = -1/m * np.sum(((1-y)*np.log(1-sigmoid(np.dot(X,theta))))+((y)*np.log(sigmoid(np.dot(X,theta)))))
      5     grad = 1/m*np.dot(X.T,(sigmoid(np.dot(X,theta))-y))
      6     return J, grad

ValueError: shapes (3,) and (1000,) not aligned: 3 (dim 0) != 1000 (dim 0)```

【问题讨论】:

  • 你可以尝试分解 J 计算线,以便我们知道哪个操作导致错误?

标签: python machine-learning scipy


【解决方案1】:

貌似是optimizer.minimize()的调用中的参数顺序导致的错误:

def costFunction(X,y,theta):
    J = 0.0
    m = y.size
    print(y.shape)
    print(X.shape)
    print(theta.shape)
    J = -1/m * np.sum(((1-y)*np.log(1-sigmoid(np.dot(X,theta))))+((y)*np.log(sigmoid(np.dot(X,theta)))))
    grad = 1/m*np.dot(X.T, (sigmoid(np.dot(X, theta))-y))
    return J, grad

这将为显式测试和optimize.minimize() 中的调用打印不同的输出。原因是 scipy.optimize.minimize() 期望初始猜测 initial_theta 作为关键字参数,因此必须在给出其他参数 x,Y 之前给出它。由于您想针对theta 进行优化,我建议您更改costFunction() 中参数的顺序,并相应地更改optimize.minimize() 的调用。这是一个工作示例:

from scipy import optimize
import numpy as np

def sigmoid(t):
    return 1./(1. + np.exp(t))

X = np.random.random(size=(1000,3))
Y = np.random.random(size=(1000))

def costFunction(theta, x,y):
    J = 0.0
    m = y.size
    J = -1/m * np.sum(((1-y)*np.log(1-sigmoid(np.dot(x,theta))))+((y)*np.log(sigmoid(np.dot(x,theta)))))
    grad = 1/m*np.dot(x.T, (sigmoid(np.dot(x, theta))-y))
    return J, grad

#To check the function :
print(X[:,:3].shape)
J,grad = costFunction(theta=np.asarray([0,0,0]), x=X[:,:3],y=Y)
print(J)
print( grad)

options = {'maxiter' : 400}
initial_theta = np.zeros(3)
x = X[:,:3]
res = optimize.minimize(costFunction,
                        x0 = initial_theta,
                        args=(x, Y),
                        jac=True,
                        method='TNC',
                        options=options)

cost = res.fun
thetaresult = res.x
print(cost)
print(thetaresult)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2021-09-24
    相关资源
    最近更新 更多