Matlab 八度线性回归(一个变量)的梯度下降

Matlab 八度线性回归(一个变量)的梯度下降,matlab,machine-learning,octave,Matlab,Machine Learning,Octave,我正试图用一个变量来实现线性回归(课程中关于机器学习的练习1) 我的理解是,这就是数学: 现在,我的代码实现如下: for iter = 1:num_iters temp1 = theta(1) - alpha * sum(X * theta - y) / m; temp2 = theta(2) - alpha * sum( (X * theta - y) .* X(2) ) / m; theta(1) = temp1; theta(2) = temp2; 在哪里 m是X

我正试图用一个变量来实现线性回归(课程中关于机器学习的练习1)

我的理解是,这就是数学:

现在,我的代码实现如下:

for iter = 1:num_iters

  temp1 = theta(1) - alpha * sum(X * theta - y) / m;
  temp2 = theta(2) - alpha * sum( (X * theta - y) .* X(2) ) / m;

  theta(1) = temp1;
  theta(2) = temp2;
在哪里

  • m是X和y中的行数
  • alpha是学习速率
  • θ是一个2X1矢量
  • X是由两个mX1矢量(一个为一个,另一个为实际变量)构成的mX2矩阵
  • X*θ-y是一个mX1向量,包含第i个hypotesys和第i个输出/y之间的差,和就是那个(向量的每个元素的和,基本上是和)
我尝试用一个小例子(m=4)手动执行此操作,我认为我的代码是正确的。。。但显然不是,否则我就不会在这里写作了。当我运行算法时,根据传递给函数的初始θ,我得到不同的θ作为回报,如果我绘制成本函数,它显然不适合某些θ值(不是全部):

这可能意味着我不太懂数学(这就解释了为什么stackoverflow上的其他人都在使用“转置”,而我没有),问题是我不知道我遇到的问题是哪一部分

我真的很想了解一些见解,但我想自己完成这个练习。基本上我是在寻求帮助,但不是寻求完整的解决方案


编辑:显然这不是逻辑错误,而是语义错误。分配temp2时,我应该写
(X*theta-y)。*X(:,2)
而不是
(X*theta-y)。*X(2)
;基本上,我没有选择X的第二列(这是一个mX2矩阵),而是一个标量(由于octave的语法)。

我只是简单地看了一下课程,看起来你基本上走对了方向,但这里有一些有用的提示:

  • m是训练集的大小(可以将其视为行的#)
  • θ0与θ1和x,y同时变化的常数是给定训练集(数据)的值。(xi和yi只是指训练数据中的单个行,例如x1,y1代表第一行)
  • hθ(x)=θ0+θ1*x不是代码中的x*θ,而是拟合的线性方程
以下是您可以从中开始工作的地方:

for iter = 1:num_iters

  theta(1) = theta(1) - alpha * sum( (theta(1)+theta(2).*X) - y) / m;
  theta(2) = theta(2) - alpha * sum( ((theta(1)+theta(2).*X) - y) .* X ) / m;
请尝试以下方法(单变量线性回归):


根据梯度下降算法您必须同时更新
θ(1)
θ(2)
的值。不能先更新
theta(1)
的值,然后使用更新的
theta(1)
值计算
theta(2)
的值

检查此代码以更好地理解:

m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    x = X(:,2);
    h = theta(1) + (theta(2)*x);

    theta_zero = theta(1) - alpha * (1/m) * sum(h-y);
    theta_one  = theta(2) - alpha * (1/m) * sum((h - y) .* x);

    theta = [theta_zero; theta_one];

    J_history(iter) = computeCost(X, y, theta);

end

这里我同时更新了
theta(1)
theta(2)
的值。梯度下降算法的定义是重复直到收敛同时更新θ值

θ(1)+θ(2)*如果将x指定为x(:,2),那么x实际上与x*θ相同。基本上,我必须解释得很糟糕,X不是向量,而是矩阵,就像这样:(110;120;125;130);,其中10-20-25-30是变量(这些变量被添加到紫色上,用于矩阵乘法)。我仍然尝试了你的代码,它成功了,并且让我看到了我原始代码中的问题:在temp2的赋值中,我写了X(2),而不是X(:,2)。修复后,我的程序似乎工作正常(评分员很高兴,我再也没有奇怪的情节了)明白了——谢谢更新,很高兴听到!必须同时更新θ的值。您必须将θ1和θ2的值存储在临时变量中,然后同时更新它。检查我的答案:
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    x = X(:,2);
    h = theta(1) + (theta(2)*x);

    theta_zero = theta(1) - alpha * (1/m) * sum(h-y);
    theta_one  = theta(2) - alpha * (1/m) * sum((h - y) .* x);

    theta = [theta_zero; theta_one];

    J_history(iter) = computeCost(X, y, theta);

end