成本函数和梯度似乎在起作用,但scipy.optimize函数却不起作用 我正在通过我的Matlab代码为Andrew NG Coursera课程,并把它变成Python。我正在研究非正则逻辑回归,在写了梯度函数和成本函数之后,我需要一些类似于fminunc的东西,在谷歌搜索之后,我找到了一些选择。它们都返回相同的结果,但与Andrew NG的预期结果代码不匹配。其他人似乎正在使其正确工作,但我想知道为什么我的特定代码在使用scipy.optimize函数时似乎没有返回所需的结果,而在代码前面的成本和渐变部分却返回了所需的结果

成本函数和梯度似乎在起作用,但scipy.optimize函数却不起作用 我正在通过我的Matlab代码为Andrew NG Coursera课程,并把它变成Python。我正在研究非正则逻辑回归,在写了梯度函数和成本函数之后,我需要一些类似于fminunc的东西,在谷歌搜索之后,我找到了一些选择。它们都返回相同的结果,但与Andrew NG的预期结果代码不匹配。其他人似乎正在使其正确工作,但我想知道为什么我的特定代码在使用scipy.optimize函数时似乎没有返回所需的结果,而在代码前面的成本和渐变部分却返回了所需的结果,python,pandas,scipy,logistic-regression,Python,Pandas,Scipy,Logistic Regression,我使用的数据可以在下面的链接中找到 这是一个很难调试的问题,并且说明了scipy.optimize接口的一个文档不足的方面。文档模糊地指出,theta将作为向量传递: 最小化一个或多个变量的标量函数 一般来说,优化问题的形式如下: minimize f(x) subject to g_i(x) >= 0, i = 1,...,m h_j(x) = 0, j = 1,...,p 其中x是一个或多个变量的向量 重要的是,它们实际上是最原始意义上的向量,一个一维数组。因此,您必须期

我使用的数据可以在下面的链接中找到


这是一个很难调试的问题,并且说明了
scipy.optimize
接口的一个文档不足的方面。文档模糊地指出,
theta
将作为向量传递:

最小化一个或多个变量的标量函数

一般来说,优化问题的形式如下:

minimize f(x) subject to

g_i(x) >= 0,  i = 1,...,m
h_j(x)  = 0,  j = 1,...,p 
其中x是一个或多个变量的向量

重要的是,它们实际上是最原始意义上的向量,一个一维数组。因此,您必须期望,无论何时
theta
被传递到您的回调中,它都将作为一维数组传递进来。但在
numpy
中,一维数组有时与二维行数组(显然,与二维列数组)的行为不同

我不知道你的情况下为什么会出现问题,但不管怎样都很容易解决。您只需在成本函数和梯度函数的顶部添加以下内容:

theta = theta.reshape(-1, 1)                                           

这保证了
theta
将如预期的那样是一个二维列数组。完成此操作后,结果是正确的。

我在处理与您相同的问题时遇到过类似的问题。正如senderle指出的,该接口不是最容易处理的,尤其是与numpy阵列接口结合使用时。。。这是我的实现,它按预期工作

定义代价函数和梯度函数 请注意,初始_θ作为形状(3,)的简单数组传递,并在函数中转换为形状(3,1)的列向量。然后梯度函数返回grad.ravel(),该函数再次具有形状(3,)。这一点很重要,因为在Scipy.optimize中使用各种优化方法会导致错误消息

请注意,不同的方法有不同的行为,但返回.ravel()似乎可以解决大多数问题

import pandas as pd
import numpy as np
import scipy.optimize as opt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def CostFunc(theta,X,y):

    #Initializing variables
    m = len(y)
    J = 0
    grad = np.zeros(theta.shape)

    #Vectorized computations
    z = X @ theta
    h = sigmoid(z)
    J = (1/m) * ( (-y.T @ np.log(h)) - (1 - y).T @ np.log(1-h));

    return J

def Gradient(theta,X,y):

    #Initializing variables
    m = len(y)
    theta = theta[:,np.newaxis]
    grad = np.zeros(theta.shape)

    #Vectorized computations
    z = X @ theta
    h = sigmoid(z)
    grad = (1/m)*(X.T @ ( h - y));

    return grad.ravel() #<-- This is the trick
调用Scipy.optimize
欢迎更多知识渊博的人发表意见,这个Scipy界面对我来说是个谜,谢谢

op
=
Scipy.optimize
?(更一般地说,我建议您发布一些我们可以立即复制、粘贴和运行的内容。)顺便说一句,
fminunc
只是他们为函数选择的名称。(我上过几次这门课。)实际使用的算法是共轭梯度法。它在scipy as中实现,也可以通过传递
method='CG'
来访问。这可能是导致您出现问题的原因,但如果没有有效的代码和数据,就很难判断。我编辑了这篇文章,将我所有的代码都包括在内。当我运行它时,我根据print语句中提供的估计得到了正确的成本和梯度,但是优化函数中的θ与倍频程输出不匹配,预测print语句也不匹配。我现在要尝试使用快速消费品功能。
import pandas as pd
import numpy as np
import scipy.optimize as opt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def CostFunc(theta,X,y):

    #Initializing variables
    m = len(y)
    J = 0
    grad = np.zeros(theta.shape)

    #Vectorized computations
    z = X @ theta
    h = sigmoid(z)
    J = (1/m) * ( (-y.T @ np.log(h)) - (1 - y).T @ np.log(1-h));

    return J

def Gradient(theta,X,y):

    #Initializing variables
    m = len(y)
    theta = theta[:,np.newaxis]
    grad = np.zeros(theta.shape)

    #Vectorized computations
    z = X @ theta
    h = sigmoid(z)
    grad = (1/m)*(X.T @ ( h - y));

    return grad.ravel() #<-- This is the trick
X = data1.iloc[:,0:2].values
m,n = X.shape
X = np.concatenate((np.ones(m)[:,np.newaxis],X),1)
y = data1.iloc[:,-1].values[:,np.newaxis]
initial_theta = np.zeros((n+1))
model = opt.minimize(fun = CostFunc, x0 = initial_theta, args = (X, y), method = 'TNC', jac = Gradient)