我正在用Python实现Andrew Ng的Coursera课程,而我现在正在做Ex2,Logistic回归。我正在尝试使用SciPy的optimize.minimize,但我似乎无法让它正常运行。我会尝试尽可能详细地总结我的代码。我正在使用Python3。这是我的变量设置,在使用pandas读取csv文件后,我将所有内容移动到numpy:
import numpy as np
import pandas as pd
from scipy.optimize import fmin_bfgs
from scipy import optimize as opt
from scipy.optimize import minimize
class Ex2:
def __init__(self):
self.pandas_data = pd.read_csv("ex2data1.txt", skipinitialspace=True)
self.data = self.pandas_data.values
self.data = np.insert(self.data, 0, 1, axis=1)
self.x = self.data[:, 0:3]
self.y = self.data[:, 3:]
self.theta = np.zeros(shape=(self.x.shape[1]))
x:(100,3)numpy ndarray
y:(100,1)numpy ndarray
theta:(3,)numpy ndarray(1-d)
然后,我定义了一个sigmoid,cost和gradient函数来给Scipy的最小化:
@staticmethod
def sigmoid(x):
return 1/(1 + np.exp(x))
def cost(self, theta):
x = self.x
y = self.y
m = len(y)
h = self.sigmoid(x.dot(theta))
j = (1/m) * ((-y.T.dot(np.log(h))) - ((1-y).T.dot(np.log(1-h))))
return j[0]
def grad(self, theta):
x = self.x
y = self.y
theta = np.expand_dims(theta, axis=0)
m = len(y)
h = self.sigmoid(x.dot(theta.T))
grad = (1/m) * (x.T.dot(h-y))
grad = np.squeeze(grad)
return grad
这些采取theta,一维numpy ndarray。成本返回标量(与给定的theta相关的成本)和渐变返回theta的1-D numpy ndarray更新。
当我运行此代码时:
def run(self):
options = {'maxiter': 100}
print(minimize(self.cost, self.theta, jac=self.grad, options=options))
ex2 = Ex2()
ex2.run()
我明白了:
有趣:0.69314718055994529
hess_inv:array([[1,0,0],
[0,1,0],
[0,0,1]])
jac:array([-0.1,-12.00921659,-11.26284221])
消息:'由于精确丢失,未必实现所需的错误。'
nfev:106
nit:0
njev:94
状态:2
成功:错误
x:array([0.,0.,0。])
处理完成,退出代码为0
在输出上无法正确获取格式,道歉。这是我正在做的事情的要点,我是从成本或渐变中错误地返回了什么?这似乎最有可能是我,但我一直在尝试各种组合和格式的返回值,似乎没有任何工作。任何帮助是极大的赞赏。这是一个带有输入文件的小Github仓库和我的实际代码,如果你很好奇的话,会有大量的调试评论和内容:https://github.com/Syncytium/ex2
编辑:除此之外,为了调试这个,我确保成本和毕业正在回归我所期望的,他们是(成本:浮动,毕业:1-D ndarray)。在最初的θ零数组上运行两个都给出了与Octave相同的值(由于提供的练习代码,我知道这是正确的)。但是,将这些值赋予最小化函数似乎并未按预期将theta值最小化。
答案 0 :(得分:2)
如果有人偶然发现并碰巧遇到同样的问题,我发现在我的sigmoid函数中我应该有
return 1/(1 + np.exp(-x))
但是
return 1/(1 + np.exp(x))
修正后,最小化函数正常收敛。