刚刚学会了渐变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的那个,这里是数据。需要帮助才能知道我哪里出错了..
答案 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.])