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

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

ex2data1

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as op


#Machine Learning Online Class - Exercise 2: Logistic Regression

#Load Data
#The first two columns contains the exam scores and the third column contains the label.

data = pd.read_csv('ex2data1.txt', header = None)
X = np.array(data.iloc[:, 0:2]) #100 x 3
y = np.array(data.iloc[:,2]) #100 x 1
y.shape = (len(y), 1)


#Creating sub-dataframes for plotting
pos_plot = data[data[2] == 1]
neg_plot = data[data[2] == 0]


#==================== Part 1: Plotting ====================
#We start the exercise by first plotting the data to understand the 
#the problem we are working with.

print('Plotting data with + indicating (y = 1) examples and o indicating (y = 0) examples.')

plt.plot(pos_plot[0], pos_plot[1], "+", label = "Admitted")
plt.plot(neg_plot[0], neg_plot[1], "o", label = "Not Admitted")
plt.xlabel('Exam 1 score')
plt.ylabel('Exam 2 score')
plt.legend()
plt.show()


def sigmoid(z):
    '''
    SIGMOID Compute sigmoid function
    g = SIGMOID(z) computes the sigmoid of z.
    Instructions: Compute the sigmoid of each value of z (z can be a matrix,
    vector or scalar).
    '''
    g = 1 / (1 + np.exp(-z))
    return g


def costFunction(theta, X, y):
    '''
    COSTFUNCTION Compute cost and gradient for logistic regression
    J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the
    parameter for logistic regression and the gradient of the cost
    w.r.t. to the parameters.
    '''
    m = len(y) #number of training examples

    h = sigmoid(X.dot(theta)) #logisitic regression hypothesis
    J = (1/m) * np.sum((-y*np.log(h)) - ((1-y)*np.log(1-h)))

    #h is 100x1, y is %100x1, these end up as 2 vector we subtract from each other
    #then we sum the values by rows
    #cost function for logisitic regression
    return J

def gradient(theta, X, y):
    m = len(y)
    grad = np.zeros((theta.shape))
    h = sigmoid(X.dot(theta))
    for i in range(len(theta)): #number of rows in theta
        XT = X[:,i]
        XT.shape = (len(X),1)
        grad[i] = (1/m) * np.sum((h-y)*XT) #updating each row of the gradient
    return grad


#============ Part 2: Compute Cost and Gradient ============
#In this part of the exercise, you will implement the cost and gradient
#for logistic regression. You neeed to complete the code in costFunction.m


#Add intercept term to x and X_test
Bias = np.ones((len(X), 1))
X = np.column_stack((Bias, X))


#Initialize fitting parameters
initial_theta = np.zeros((len(X[0]), 1))


#Compute and display initial cost and gradient
(cost, grad) = costFunction(initial_theta, X, y), gradient(initial_theta, X, y)

print('Cost at initial theta (zeros): %f' % cost)
print('Expected cost (approx): 0.693\n')
print('Gradient at initial theta (zeros):')
print(grad)
print('Expected gradients (approx):\n -0.1000\n -12.0092\n -11.2628')


#Compute and display cost and gradient with non-zero theta
test_theta = np.array([[-24], [0.2], [0.2]]);
(cost, grad) = costFunction(test_theta, X, y), gradient(test_theta, X, y)

print('\nCost at test theta: %f' % cost)
print('Expected cost (approx): 0.218\n')
print('Gradient at test theta:')
print(grad)
print('Expected gradients (approx):\n 0.043\n 2.566\n 2.647\n')


result = op.fmin_tnc(func = costFunction, x0 = initial_theta, fprime = gradient, args = (X,y))
result[1]


Result = op.minimize(fun = costFunction, 
                                 x0 = initial_theta, 
                                 args = (X, y),
                                 method = 'TNC',
                                 jac = gradient, options={'gtol': 1e-3, 'disp': True, 'maxiter': 1000})


theta = Result.x
theta

test = np.array([[1, 45, 85]]) 
prob = sigmoid(test.dot(theta))
print('For a student with scores 45 and 85, we predict an admission probability of %f,' % prob)
print('Expected value: 0.775 +/- 0.002\n')

#1楼 票数:3 已采纳

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

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

通常,优化问题的形式为:

 minimize f(x) subject to g_i(x) >= 0, i = 1,...,m h_j(x) = 0, j = 1,...,p 

其中x是一个或多个变量的向量。

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

我不知道为什么会导致您的问题,但是无论如何都可以轻松解决。 您只需在成本函数和梯度函数的顶部添加以下内容:

theta = theta.reshape(-1, 1)                                           

如所预期的,这保证theta将是二维列阵列。 完成此操作后,结果将是正确的。

#2楼 票数:0

我与Scipy遇到过类似的问题,与您处理相同的问题。 正如senderle指出的那样,该接口并不是最简单的处理方法,尤其是与numpy数组接口结合使用时...这是我的实现,按预期工作。

定义成本和梯度函数

请注意,initial_theta作为形状(3,)的简单数组传递,并在函数内转换为形状(3,1)的列向量。 然后,梯度函数将返回具有形状(3,)的grad.ravel()。 这很重要,因为这样做会导致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

初始化变量和参数

Note that initial_theta.shape返回(3,)

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))

调用Scipy.optimize

model = opt.minimize(fun = CostFunc, x0 = initial_theta, args = (X, y), method = 'TNC', jac = Gradient)

欢迎来自知识渊博的人们的任何评论,这个Scipy界面对我来说还是个谜,谢谢

  ask by Scott Nelson translate from so

未解决问题?本站智能推荐:

1回复

即使`maxiter=0`,`scipy.optimize`函数也会挂起。

我正在尝试通过简单的多类逻辑回归训练MNIST数据(我从Kaggle下载),但是scipy.optimize函数挂起了。 这是代码: import csvfrom math import expfrom numpy import *from scipy.optimize import fmi
1回复

Scipyfmin_tnc未优化成本函数

目的:是使用scipy fmin_tnc优化器优化成本函数。 问题:尽管cost和gradient函数在单独执行时表现出预期的效果,但在通过fmin_tnc优化时,它们具有相同的初始参数-返回了zeros数组。 参见下面的代码: 输出 result [0] ===> [0,
1回复

Scipy.optimize:最小化函数产生错误

我正在尝试使用scipy.optimize优化预测参数。 我跟着教程,还在stackoverflow上找到了一些很好的例子,但我面临一个我无法解决的问题。 我开始怀疑在 scipy 中使用 Pandas 是否是一个糟糕的选择? 我已将我的代码设置如下: 和 df 看起来像这样: 我对不断收到的错误感
1回复

1.取np.log时如何处理0?2.scipy,optimize.fmin_tnc即使在转置后也会给出形状错误

我有两个关于逻辑回归的python 3实现(Andrew Ng课程)的问题: 当我取 alpha=0.01 时,我得到两个错误: 一种。 记录日志时遇到零值湾矩阵乘法误差我知道 sigmoid 函数只会返回 (0,1) 之间的值,但是在运行梯度下降时打印假设时,我意识到一些值被四舍五入为 1(使
1回复

NumPy日志函数抛出int属性错误

我正在尝试使用日志丢失功能,并不断收到以下错误- 引发此错误的代码行是- 哪里pred是- 而行动是- 有人可以帮我弄这个吗? 完全将墙壁推高。
2回复

Python+scipy中sigmoid回归的参数

我有一个Python数组,其中包含表示特定年份中现象发生次数的日期 。 该向量包含200个不同的日期,每个日期重复一定次数。 重复是该现象的发生次数。 我设法使用以下代码片段计算并绘制matplotlib的累积总和: 在蓝色中,您可以看到描绘累积总和的曲线,在其他颜色中可以看到我想要获
2回复

如何在使用pythonscipy.optimize.minimize时确保解决方案是全局最小值

我在python中实现逻辑回归。 为了找到theta,我正在努力确定哪种算法是最好的算法,该算法始终可以保证全局最优,而不必担心初始参数theta。 其中ex2data1.txt的内容为: 上面的代码给出theta = Result.x值,为[-25.87282405 0.211930
1回复

用scipy.minimize()训练逻辑神经元

我在逻辑神经元训练中使用scipy.minimize()遇到麻烦。 我的成本和梯度函数已成功测试。 scipy.minimize()使我返回“ IndexError:数组的索引过多”。 我正在使用method ='CG',但是其他方法也一样。 W(权重),XX(训练集)和Y(结果)都