为了在逻辑回归中获得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
答案 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)