当使用optimize.minimize()但引用的函数没有错误时,如何解决报告的Value错误?

时间:2019-04-01 07:10:52

标签: python machine-learning scipy

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

这是我的costFunction代码,在这里我将此函数称为optimize.minimize()

cola   colb   
C        C       
C        NA     
C        C      
D        D      

1 个答案:

答案 0 :(得分: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 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)