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

问题描述 投票:0回答:1

我正在用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

并且:(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的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

晚上:0

晚上:94

状态:2

成功:错

x:数组([0.,0.,0。])

进程以退出代码0结束

道歉,无法完全获得输出格式。这是我正在做的事情的要点,我是从成本或渐变中错误地返回了什么?这似乎最有可能是我,但我一直在尝试各种组合和格式的返回值,似乎没有任何工作。任何帮助是极大的赞赏。这里有一个小的Github仓库,输入文件和我的实际代码,如果你很好奇的话,还有大量的调试评论和内容:https://github.com/Syncytium/ex2

编辑:除此之外,调试这个我确保成本和毕业回报我所期望的,他们是(成本:浮动,毕业:1-D ndarray)。在最初的θ零数组上运行两个都给出了与Octave相同的值(由于提供的练习代码,我知道这是正确的)。但是,将这些值赋予最小化函数似乎不会像预期的那样最小化θ值。

python python-3.x numpy scipy
1个回答
2
投票

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

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

但是

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

在确定之后,最小化函数正常收敛。

© www.soinside.com 2019 - 2024. All rights reserved.