使用梯度下降实现线性回归

问题描述 投票:-1回答:1

我刚开始从事机器学习,目前正在接受安德鲁·吴的机器学习课程。我已经在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.任何帮助将不胜感激。谢谢。

python machine-learning linear-regression
1个回答
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表示你需要同时更新这两个版本。为此,将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

它应该现在可以工作,如果没有,让我知道,我会调试我。

© www.soinside.com 2019 - 2024. All rights reserved.