我想实现Logistic回归,我使用Scipy的Optimize模块来找到优化的theta值。使用fmin函数时,我能够得到正确的值。但是我想在使用需要渐变的fmin_bfgs函数时这样做。fmin_bfgs Logistic回归和Scipy优化
下面的代码片段:
#Returns Cost of current theta values and gradient of cost w.r.t theta.
def costFunction(theta, X, y, _lambda):
#Initializes useful variables
m = len(y)
grad = np.zeros((np.shape(theta)))
#Solves for Hypothesis for input X.
h_x = Sigmoid(np.dot(X,theta))
#Reshaped because numpy kept returning row vector, not column.
h_x = h_x.reshape((m,1))
#Cost is broken up into terms for simplicity.
term1 = -y*np.log(h_x)
term2 = (1-y)*np.log((1-h_x))
#Regularized Cost FUnction
J = (1/m) * sum(term1-term2) + (_lambda/(2*m)) * sum(np.square(theta[1:][:]))
#Gradient for Theta1
grad_reg = (_lambda/m)*theta[1:]
#Combines gradient for Theta1 and onward.
grad = (1/m)* (np.dot(np.transpose(X),(h_x-y))) + np.vstack(([0],grad_reg))
return J,grad
#Finds Optimal Value for theta
cost, grad = costFunction(initial_theta, X,y, _lambda)
opt_theta = fmin_bfgs(cost,x0=initial_theta,fprime=grad, args = (X,y,_lambda))
我得到的错误是'numpy.ndarray' object is not callable
这是从优化模块中的function_wrapper
功能。我甚至尝试在两个不同的函数中返回渐变和成本,但得到了vstack
某种错误(如果这很重要/有帮助)。
就我所见,我已经提供了优化功能所要求的。
编辑/更新:我意识到我得到的错误是因为当期望函数返回这些参数时,我将成本和grad numpy数组作为参数传递。我意识到我可以创建一个包装函数?为了在不使用两个单独函数的情况下获得这两个值,但为了临时目的,我更改了costFunction,因此它只返回成本,并创建了一个全新的函数Grad()
(尽管代码相同),只返回grad。这再次给了我all the input array dimensions except for the concatenation axis must match exactly
vstack错误。
我向您提供了有关复制s简单,所以我有渐变功能吐出第一个渐变应该是什么。值是正确的,但似乎有一个奇怪的间距。它是:'[-0.1 -12.00921659 -11.26284221]'。在前两个值之间它有一个奇数的间距。我去了vstack函数错误的地方,它显然收到了我打印出来的元组。在flatten方法之前是'([0],array([[0], [0。]]))',而在之后是'([0],array([0,0]))''扁平化方法。我如何得到这是一个单一的数组? – user3047023 2014-12-03 15:22:11
这不是很有帮助。最好把你的问题分解成单独的问题:有一个关于最小化本身的问题,另外一个关于成本函数。 – 2014-12-03 17:09:44
好吧,那么我明显想要这个的是,如何获得'np.vstack(([0],grad_reg))'返回一个数组?不像'([0],array([0.,0。]))''? – user3047023 2014-12-03 17:36:08