[英]linear regression with multiple variables in matlab, formula and code do not match
我有以下数据集:
X
X =
1.0000 0.1300 -0.2237
1.0000 -0.5042 -0.2237
1.0000 0.5025 -0.2237
1.0000 -0.7357 -1.5378
1.0000 1.2575 1.0904
1.0000 -0.0197 1.0904
1.0000 -0.5872 -0.2237
1.0000 -0.7219 -0.2237
1.0000 -0.7810 -0.2237
1.0000 -0.6376 -0.2237
1.0000 -0.0764 1.0904
1.0000 -0.0009 -0.2237
1.0000 -0.1393 -0.2237
1.0000 3.1173 2.4045
1.0000 -0.9220 -0.2237
1.0000 0.3766 1.0904
1.0000 -0.8565 -1.5378
1.0000 -0.9622 -0.2237
1.0000 0.7655 1.0904
1.0000 1.2965 1.0904
1.0000 -0.2940 -0.2237
1.0000 -0.1418 -1.5378
1.0000 -0.4992 -0.2237
1.0000 -0.0487 1.0904
1.0000 2.3774 -0.2237
1.0000 -1.1334 -0.2237
1.0000 -0.6829 -0.2237
1.0000 0.6610 -0.2237
1.0000 0.2508 -0.2237
1.0000 0.8007 -0.2237
1.0000 -0.2034 -1.5378
1.0000 -1.2592 -2.8519
1.0000 0.0495 1.0904
1.0000 1.4299 -0.2237
1.0000 -0.2387 1.0904
1.0000 -0.7093 -0.2237
1.0000 -0.9584 -0.2237
1.0000 0.1652 1.0904
1.0000 2.7864 1.0904
1.0000 0.2030 1.0904
1.0000 -0.4237 -1.5378
1.0000 0.2986 -0.2237
1.0000 0.7126 1.0904
1.0000 -1.0075 -0.2237
1.0000 -1.4454 -1.5378
1.0000 -0.1871 1.0904
1.0000 -1.0037 -0.2237
THETA
0
0
0
ÿ
y =
399900
329900
369000
232000
539900
299900
314900
198999
212000
242500
239999
347000
329999
699900
259900
449900
299900
199900
499998
599000
252900
255000
242900
259900
573900
249900
464500
469000
475000
299900
349900
169900
314900
579900
285900
249900
229900
345000
549000
287000
368500
329900
314000
299000
179900
299900
239500
X集代表多变量回归的值,第一列代表X0,第二列X1; 等等。
实现公式如下:
我已经实现了一个matlab代码,它是:
for i=1:size(theta,1)
h=X*theta;
sumE=sum((h-y).*X(:,i));
theta(i)=theta(i)-alpha*(1/m)*sumE;
end
这是一个for循环内部从1循环到迭代次数(m的值不相关,例如可以设置为40)。 问题是,即使代码有效并且结果是预期的结果,当我将其提交到在线检查程序时,看起来我的结果是错误的。 原因是我应该同时更新theta。
我从Internet获得了以下Matlab代码:
h = X*theta;
theta = theta - alpha / m * (X'*(h - y));
当我运行互联网解决方案时,它给了我几乎与我相同的答案,在第6个小数位只有微妙的差异。 当我将该答案提交给在线程序时,它已被完全接受,但我想知道总结在哪里? 在公式中明确指出不再在Internet解决方案中的总和。 也许这两个代码都很好,但我不知道互联网作者是否已经制定了一些线性代数技巧。 有帮助吗?
谢谢
我不确定我是否理解你的问题,但你从互联网上复制的公式是X'(hy)。 注意X后有一个转换信号! 所以,这是一个矩阵产品。 你的总和(你的循环)被这个矩阵产品所取代。
他们的代码同时更新theta。 您的代码使用theta的较新值迭代theta的行,以重新生成用于更新theta的后续行的h
。 我敢打赌,这就是差异。
为清楚起见,让我们跟踪矩阵中θ的每次迭代。 他们的迭代j
代码是:
h = X*theta(:,j);
theta(:,j+1) = theta(:,j) - alpha / m * (X'*(h - y));
另一方面,您的代码将是:
for i=1:size(theta,1)
my_mismatched_theta = [theta(1:i-1, j+1); theta(i:end, j)];
h=X * my_mismatched_theta;
sumE=sum((h-y).*X(:,i));
theta(i,j)=theta(i,j)-alpha*(1/m)*sumE;
end
它不会同时更新theta。 您正在使用较新版本的theta(即theta(:,j+1)
)在更新theta的后续行时生成h
。
将您的代码更改为我在下面的代码,看看您是否得到相同的答案:
h=X*theta; %placed outside of loop so it doesn't get updated by new theta values
for i=1:size(theta,1)
sumE=sum((h-y).*X(:,i));
theta(i)=theta(i)-alpha*(1/m)*sumE;
end
在这种情况下,您的算法可能会收敛到与他们相同的点,但在某些情况下,您正在进行的casecade更新会在其他情况下产生奇怪现象。 谁知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.