fmin_cg发出意外错误

时间:2015-01-31 12:18:11

标签: python scipy

刚刚学会了渐变desc。 algo和我试图实现它,输入是在2D平面上设置的坐标,目的是预测通过大多数给定输入点的线。 使用python,我写道:

def cost( theta, data ):
    X, y = data[:, 0], data[:, 1]
    m = shape(X)[0]
    y    = y.reshape(m, 1)
    X = c_[ones((m, 1)), X]

    J = X.dot(theta) - y
    J = J.T.dot(J) / (m)
    # print(J[0, 0])
    return J

def gradDesc(theta, data):
    X = data[:, 0]
    y  = data[:, 1]
    m = shape(X)[0]
    X = c_[ones((m, 1)), X]
    y    = y.reshape(m, 1)
    hypo = X.dot(theta)
    grad = X.T.dot(hypo - y)/m
    # print(grad)
    return grad

def run(theta, data ):
    result  = scipy.optimize.fmin_cg( f = cost, fprime=gradDesc, x0=theta,  \
                                        args = (data), maxiter=50, disp=False, full_output=True )
    theta = result[0]
    minCost = result[1]
    return theta, minCost

def main():
    data = genfromtxt('in.txt', delimiter=',')
    theta = zeros((2, 1))
    # plot_samples(data)
    run(theta, data)

我尝试使用fmin_cg()来降低成本,但其中一个参数' args'导致错误: 第282行,在function_wrapper中     返回函数(*(wrapper_args + args)) TypeError:gradDesc()需要2个位置参数,但是给出了5个

在docs中我读到args是传递给f和fprime的params列表,而不是要更改为f的那个,这里是数据。需要帮助才能知道我哪里出错了..

完整代码:http://ideone.com/E22yzl

1 个答案:

答案 0 :(得分:0)

额外的参数必须是一个元组。如果你想要一个名为data的参数,你需要构造一个单元素元组(data,) - 注意逗号。这与(data)不同,其中括号被有效忽略。

示例:

>>> def f(x, data):
...    return (x - data.sum())**2
... 
>>> import numpy as np
>>> data = np.asarray([1., 2., 3.])
>>> fmin_cg(f, x0=11., args=(data,))
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 2
         Function evaluations: 15
         Gradient evaluations: 5
array([ 6.])