繁体   English   中英

matlab中的多个变量的线性回归,公式和代码不匹配

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM