我有以下数据集:
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 set表示多变量回归的值,第一列代表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到n次迭代(m的值不相关,例如可以设置为40)。 问题是,即使代码有效并且结果是预期的结果,当我将其提交到在线检查程序时,看起来我的结果是错误的。原因是我应该同时更新theta。
我从互联网上获得了以下Matlab代码:
h = X*theta;
theta = theta - alpha / m * (X'*(h - y));
当我运行互联网解决方案时,它给了我几乎与我相同的答案,在第6个小数位只有微妙的差异。当我将该答案提交给在线程序时,它已被完全接受,但我想知道总结在哪里?在公式中明确指出不再在Internet解决方案中的总和。也许这两个代码都很好,但我不知道互联网作者是否已经制定了一些线性代数技巧。有什么帮助吗?
谢谢
答案 0 :(得分:2)
我不确定我是否理解你的问题,但你从互联网上复制的公式是X'(h-y)。注意X后有一个转换信号!所以,这是一个矩阵产品。您的总和(您的循环)将替换为此矩阵产品。
答案 1 :(得分:0)
他们的代码同时更新theta。您的代码使用theta的较新值迭代theta的行,以重新生成h
,用于更新theta的后续行。我非常重视这是不同的。
为清楚起见,让我们在矩阵中跟踪每次 theta迭代。
他们的迭代代码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(即theta(:,j+1)
)来生成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更新会在其他情况下产生奇怪现象。谁知道呢。