gpt4 book ai didi

python - 使用 fmin_bfgs 进行逻辑回归和 Scipy 优化

转载 作者:行者123 更新时间:2023-11-30 09:56:20 25 4
gpt4 key购买 nike

我正在尝试实现逻辑回归,并使用 Scipy 的 Optimize 模块来查找优化的 theta 值。使用 fmin 函数时我能够获得正确的值。但我想在使用需要梯度的 fmin_bfgs 函数时这样做。

这是一个代码片段:

#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'对象不可调用,它来自优化模块中的function_wrapper函数。我什至尝试在两个不同的函数中返回梯度和成本,但出现了某种 vstack 错误(如果这很重要/有帮助的话)。

据我所知,我已经提供了优化函数所要求的内容。

编辑/更新:我意识到我收到的错误是因为当我期望函数返回这些参数时,我将成本和 grad numpy 数组作为参数传递。我意识到我可以创建一个包装函数?为了在不使用两个单独的函数的情况下获取这两个值,但出于临时目的,我更改了 costFunction,因此它只返回成本,并创建了一个全新的函数 Grad()(尽管代码相同) )只返回毕业生。这再次给我带来了除连接轴之外的所有输入数组维度必须完全匹配 vstack 错误。

最佳答案

如果没有最小的可重现示例,就很难调试。

我调试它的方式是从一些非常简单的事情开始,以确保基本语法正确。有多种方法可以使用带有显式梯度的 bfgs 最小化。首先,没有梯度信息:

In [1]: import numpy as np

In [2]: from scipy.optimize import minimize

In [3]: def f(x):
...: return np.sum((x-2.)**2)
...:

In [4]: x0 = np.ones(3)

In [5]: minimize(f, x0, method='bfgs')
Out[5]:
status: 0
success: True
njev: 4
nfev: 20
fun: 1.6656677750444977e-16
x: array([ 1.99999999, 1.99999999, 1.99999999])
<snip>

现在,有了渐变,您可以拥有一个返回函数渐变的可调用函数:

In [6]: def f_and_jac(x):
...: val = np.sum((x-2.)**2)
...: grad = 2.*(x-2.)
...: return val, grad
...:

In [7]: minimize(f_and_jac, x0, method='bfgs', jac=True) # notice the 'jac' parameter
Out[7]:
status: 0
success: True
njev: 4
nfev: 4
fun: 0.0
x: array([ 2., 2., 2.])

或者,您可以将 jac 设置为可调用函数,它应与成本函数具有相同的签名并返回梯度:

In [8]: def jac(x):
...: return 2.*(x-2.)
...:

In [9]: minimize(f, x0, method='bfgs', jac=jac)
Out[9]:
status: 0
success: True
njev: 4
nfev: 4
fun: 0.0
x: array([ 2., 2., 2.])

关于python - 使用 fmin_bfgs 进行逻辑回归和 Scipy 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com