使用渐变下降来实现线性回归

时间:2018-03-03 05:59:22

标签: python machine-learning linear-regression

我刚开始从事机器学习,目前正在参加由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.任何帮助将不胜感激。谢谢。

1 个答案:

答案 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

现在应该可以工作,如果没有,请告诉我,我会调试一下。