Matlab 八度线性回归(一个变量)的梯度下降
我正试图用一个变量来实现线性回归(课程中关于机器学习的练习1) 我的理解是,这就是数学: 现在,我的代码实现如下: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
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之间的差,和就是那个(向量的每个元素的和,基本上是和)
编辑:显然这不是逻辑错误,而是语义错误。分配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