如何修复在使用 optimize.minimize() 时报告的数值错误,但所引用的函数本身没有错误?

为了在逻辑回归中获取 Theta 的最优值,我使用了 optimize.minimize() 函数,我的函数 costFunction(X,y,theta) 根据给定的 X、y 和 theta 值返回成本和梯度。我已经用 theta 的初始值检查了我的函数 costFunction(),它运行正常。但是在 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.funtheta = res.xprint("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, gradValueError: shapes (3,) and (1000,) not aligned: 3 (dim 0) != 1000 (dim 0)```

回答:

看起来错误是由调用 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 optimizeimport numpy as npdef 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.funthetaresult = res.xprint(cost)print(thetaresult)

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注