matlab - 倍频程线性回归(一个变量)的梯度下降

标签 matlab machine-learning octave

我正在尝试使用线性回归的单个变量来实现线性回归(来自 coursera 上有关机器学习的 standford's course 的练习 1)。

我的理解是,这就是数学:enter image description here

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

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 值(并非全部):

This looks about right

This doesn't

这可能意味着我并不真正理解数学(这可以解释为什么 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/

相关文章:

algorithm - 使用大半径/标准差对图像进行高斯模糊时的奇怪行为

matlab - matlab中的k最近邻分类器

tensorflow - Keras 中 Adam 优化器的指数衰减学习率参数

python - 如何在Python中使用数据框进行文本分类

matlab - 找到具有最低最大值的行/列

c++ - 允许嵌套逻辑 && 运算符吗?

一个包中的 Matlab gui 文件?

matlab - 在 matlab 中以 z 顺序绘制玫瑰图

r - 如何更改 R 中的 t-sne 距离?

matlab - 在 matlab 中装箱