给定一组点,我们希望找到最适合数据的直线。我已经实现了一个版本,其中通过梯度下降来最小化成本函数,现在我想使用scipy(scipy.optimize.minimize
)中的算法。
我试过了:
def gradDescVect(X, y, theta, alpha, iters):
m = shape(X)[0]
grad = copy(theta)
for c in range(0, iters):
error_sum = hypo(X, grad) - y
error_sum = X.T.dot(error_sum)
grad -= (alpha/m)*error_sum
return grad
def computeCostScipy(theta, X, y):
"""Compute cost, vectorized version"""
m = len(y)
term = hypo(X, theta) - y
print((term.T.dot(term) / (2 * m))[0, 0])
return (term.T.dot(term) / (2 * m))[0, 0]
def findMinTheta( theta, X, y):
result = scipy.optimize.minimize( computeCostScipy, theta, args=(X, y), method='BFGS', options={"maxiter":5000, "disp":True} )
return result.x, result.fun
这实际上工作得非常好,并且给出了与原始grad desc版本非常接近的结果。
唯一的问题似乎是fminunc()
在达到costFunction()
的最小值之前停止执行。
确定costFunction()
工作正常,没有。 minimize()
的迭代设置大于它所需的最大值。
输出:
Optimization terminated successfully.
Current function value: 15.024985
Iterations: 2
Function evaluations: 16
Gradient evaluations: 4
Cost : 15.0249848024
Thteta : [ 0.15232531 0.93072285]
虽然正确的结果是:
Cost : 4.48338825659
Theta : [[-3.63029144]
[ 1.16636235]]