我试图模仿Andrew NG的机器学习课程到Python的线性回归梯度下降算法,但由于某些原因,我的实现无法正常工作。
这是我在倍频程中的实现,它工作正常:
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
prediction = X*theta;
margin_error = prediction - y;
gradient = 1/m * (alpha * (X' * margin_error));
theta = theta - gradient;
J_history(iter) = computeCost(X, y, theta);
end
end
然而,当我出于某种原因将其转换为Python时,它并没有给出准确的结果。成本似乎在上升而不是下降。
下面是我在Python中的实现:
def gradientDescent(x, y, theta, alpha, iters):
m = len(y)
J_history = np.matrix(np.zeros((iters,1)))
for i in range(iters):
prediction = x*theta.T
margin_error = prediction - y
gradient = 1/m * (alpha * (x.T * margin_error))
theta = theta - gradient
J_history[i] = computeCost(x,y,theta)
return theta,J_history
我的代码正在编译,没有任何错误。请注意,这是θ:
theta = np.matrix(np.array([0,0]))
Alpha和iters设置为:
alpha = 0.01
iters = 1000
当我运行它时,
opt_theta, cost = gradientDescent(x, y, theta, alpha, iters)
然后打印出opt\u theta,我得到:
matrix([[ 2.36890383e+16, -1.40798902e+16],
[ 2.47503758e+17, -2.36890383e+16]])
我什么时候应该得到这个:
matrix([[-3.24140214, 1.1272942 ]])
我做错了什么?
编辑:
成本函数
def computeCost(x, y, theta):
# Get length of data set
m = len(y)
# We get theta transpose because we are working with a numpy array [0,0] for example
prediction = x * theta.T
J = 1/(2*m) * np.sum(np.power((prediction - y), 2))
return J