我正在尝试使用线性回归的单个变量来实现线性回归(来自 coursera 上有关机器学习的 standford's course 的练习 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 是学习率
- theta 是一个 2X1 向量
- X 是由两个 mX1 向量(其中一个为实际变量)组成的 mX2 矩阵
- X * theta - y 是一个 mX1 向量,包含每个第 I 个假设与第 I 个输出/y 之间的差异,其总和就是这个(向量每个元素的总和,基本上是求和)。<
我尝试用一个小例子(m = 4)手动执行此操作,我认为我的代码是正确的......但显然不是,否则我不会在这里写。当我运行算法时,我会根据传递给函数的初始 theta 得到不同的 theta 作为返回,如果我绘制成本函数,那么它显然不适合某些 theta 值(并非全部):
这可能意味着我并不真正理解数学(这可以解释为什么 stackoverflow 上的其他人都在使用“转置”而我没有),问题是我不知道哪一部分是我的”我遇到了麻烦。
我真的很感激一些见解,但我想自己完成这个练习。基本上我正在寻求帮助,但不是完整的解决方案
编辑:显然这不是逻辑错误,而是语义错误。当分配 temp2 时,我应该写 (X * theta - y) .* X(:,2)
而不是(X * theta - y) .* X(2)
;基本上,我没有选择 X 的第二列(这是一个 mX2 矩阵),而是选择一个标量(由于 Octave 的语法)。
最佳答案
我只是简单地浏览了该类(class),看起来您大部分都在正确的轨道上,但这里有一些有用的提示:
- m 是训练集的大小(您可以将其视为行数)
- θ0 是与 θ1 同时变化的常数,x,y 是给定训练集(数据)的值。 (xi 和 yi 仅表示训练数据中的各个行,例如 x1、y1 代表第一行)
- hθ(x)=θ0+θ1*x 不是 X*theta,如您在代码中所示,而是您正在拟合的线性方程
这里是您可以工作的起点:
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;
关于matlab - 倍频程线性回归(一个变量)的梯度下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43403064/