Python3 Scipy:由于精度损失,不一定能实现所需的错误

时间:2017-12-22 01:06:59

标签: python python-3.x numpy scipy

我正在用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值最小化。

1 个答案:

答案 0 :(得分:2)

如果有人偶然发现并碰巧遇到同样的问题,我发现在我的sigmoid函数中我应该有

return 1/(1 + np.exp(-x))

但是

return 1/(1 + np.exp(x))

修正后,最小化函数正常收敛。