fmin_cg 出现意外错误

fmin_cg giving nexpected error

刚刚学习了梯度描述。算法和我试图实现它,输入是二维平面上的一组坐标,目的是预测通过大多数给定输入点的线。 使用 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 return 函数(*(wrapper_args + 参数)) TypeError:gradDesc() 接受 2 个位置参数,但给出了 5 个

我在文档中读到 args 是传递给 f 和 fprime 的参数列表,而不是要更改以最小化 f 的参数列表,这里是数据。需要帮助知道我哪里出错了..

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

额外的参数必须是一个元组。如果您想要一个名为 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.])