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

时间:2014-03-04 13:40:45

标签: matlab machine-learning linear-regression

我有以下数据集:

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;等等。

实施公式如下:

enter image description here

我已经实现了一个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解决方案中的总和。也许这两个代码都很好,但我不知道互联网作者是否已经制定了一些线性代数技巧。有什么帮助吗?

谢谢

2 个答案:

答案 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更新会在其他情况下产生奇怪现象。谁知道呢。