我刚开始从事机器学习,目前正在参加由Andrew Ng的机器学习课程。我已经在python中实现了线性回归算法,但结果并不可取。我的python代码如下:
import numpy as np
x = [[1,1,1,1,1,1,1,1,1,1],[10,20,30,40,50,60,70,80,90,100]]
y = [10,16,20,23,29,30,35,40,45,50]
x = np.array(x)
y = np.array(y)
theta = np.zeros((2,1))
def Cost(x,y,theta):
m = len(y)
pred_ions = np.transpose(theta).dot(x)
J = 1/(2*m) * np.sum((pred_ions - y)*(pred_ions - y))
return J
def GradientDescent(x,y,theta,iteration,alpha):
m = len(y)
pred_ions = np.transpose(theta).dot(x)
i = 1
while i <= iteration:
theta[0] = theta[0] - alpha/m * np.sum(pred_ions - y)
theta[1] = theta[1] - alpha/m * np.sum((pred_ions - y)*x[1,:])
Cost_History = Cost(x,y,theta)
i = i + 1
return theta[0],theta[1]
itera = 1000
alpha = 0.01
a,b = GradientDescent(x,y,theta,itera, alpha)
print(a)
print(b)
我无法弄清楚究竟是什么问题。但是,我的结果非常奇怪。根据上面的代码,参数的值是298和19890.任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
阿。我不久前做了这个任务。
请参见作业PDF第7页中提到的内容:
Octave / MATLAB数组索引从一开始,而不是零。如果你是 将θ0和θ1存储在一个名为theta的向量中,值将为 theta(1)和theta(2)。
因此,在您的while循环中,将theta[0]
和theta[1]
更改为theta[1]
和theta[2]
。它应该正常工作。
此外,如果您将Cost存储在Cost_History中,则不应包含迭代变量,如
Cost_History[i] = Cost(x,y,theta)
请检查一下!希望这有帮助。
编辑1:好的,我现在已经理解了这个问题。在他的视频中,Andrew Ng表示你需要同时更新两个thetas 。为此,将theta矩阵存储在临时变量中。并根据临时值更新theta [0]和theta [1]。
目前在您的代码中,theta[1] =
期间它已将theta[0]
更改为较新的值,因此两者都不会同时更新。
相反,请执行此操作:
while i <= iteration:
temp = theta
theta[0] = theta[0] - alpha/m * np.sum(np.transpose(temp).dot(x) - y)
theta[1] = theta[1] - alpha/m * np.sum((np.transpose(temp).dot(x) - y)*x[1,:])
Cost_History[i] = Cost(x,y,theta)
i = i + 1
现在应该可以工作,如果没有,请告诉我,我会调试一下。