使用一个变量计算线性回归的成本函数,而不使用Matrix

时间:2015-10-15 02:46:20

标签: matlab matrix machine-learning gradient-descent

我是Matlab和机器学习的新手,我试图计算梯度下降的成本函数。

函数computeCost有3个参数:

  • X mx2矩阵
  • y m维向量
  • theta :二维向量

我已经有了使用矩阵乘法的解决方案

function J = computeCost(X, y, theta)
  m = length(Y);
  h = X * theta;
  sError = (h - y) .^ 2;
  J = sum(sError) / (2 * m);
end

但是现在,我试图在没有矩阵乘法的情况下做同样的事情

function J = computeCost(X, y, theta)
  m = length(Y);
  S = 0;
  for i = 1:m
    h = X(i, 1) + theta(2) * X(i, 2);
    S = S + ((h - y(i)) ^ 2);
  end
  J = (1/2*m) * S;
end

但是我没有得到相同的结果,并且首先是肯定的(我之前已经使用过它)。

1 个答案:

答案 0 :(得分:2)

你有两个轻微(但基本)的错误 - 它们是非常简单的错误,但肯定可以忽略。

  1. 您忘记在您的假设中包含偏见词:

    h = X(i,1)*theta(1) + X(i,2)*theta(2);
    %//         ^^^^^^
    

    请记住,线性回归的假设等于theta^{T}*x。您没有包含所有theta字词 - 仅包含第二个字词。

  2. (2*m)标准化的最后一句话略有偏差。您目前拥有它:

    J = (1/2*m) * S;
    

    因为乘法和除法具有相同的操作规则,所以这与(1/2)*m相同,而这不是你想要的。只需确保(2*m)包含自己的括号,以确保将其评估为S / (2*m)

    J = (1/(2*m)) * S;
    

    这将确保首先评估2*m,然后通过乘以误差平方和得到它的倒数。

  3. 当您解决这些问题时,您将获得与使用矩阵公式相同的结果。

    BTW,你的代码中有轻微错误。它应该是m = length(y),而不是m = length(Y)