成本函数,线性回归,试图避免硬编码theta。八度。

时间:2014-03-25 04:22:58

标签: machine-learning octave linear-regression

我是通过Coursera在Andrew Ng教授的机器学习课程的第二周。我们正在进行线性回归,现在我正在处理成本函数的编码。

我编写的代码正确地解决了问题,但是没有通过提交过程并且没有通过单元测试,因为我已经对theta的值进行了硬编码,并且不允许超过两个theta值。

这是我到目前为止的代码

function J = computeCost(X, y, theta)

m = length(y);
J = 0;

for i = 1:m,
    h = theta(1) + theta(2) * X(i)
    a = h - y(i);
    b = a^2;
    J = J + b;
    end;
J = J * (1 / (2 * m));

end

单元测试是

computeCost( [1 2 3; 1 3 4; 1 4 5; 1 5 6], [7;6;5;4], [0.1;0.2;0.3])

并且应该生成ans = 7.0175

所以我需要添加另一个for循环来迭代theta,因此允许theta的任意数量的值,但是如果我可以绕过如何/在哪里,我会被诅咒。

任何人都可以建议一种方法,我可以在这个函数中允许任意数量的theta值吗?

如果您需要更多信息来了解我想要提出的问题,我会尽力提供。

10 个答案:

答案 0 :(得分:66)

您可以在Octave / Matlab中使用矢量化操作。 迭代整个向量 - 如果你的程序语言允许你对操作进行向量化,那就太糟糕了。 R,Octave,Matlab,Python(numpy)允许此操作。 例如,如果theta =(t0,t1,t2,t3)和X =(x0,x1,x2,x3),则可以获得标量生成: theta * X' =(t0,t1,t2,t3)*(x0,x1,x2,x3)' = t0 * x0 + t1 * x1 + t2 * x2 + t3 * x3 结果将是标量。

例如,您可以通过下一种方式在代码中对h进行矢量化:

H = (theta'*X')';
S = sum((H - y) .^ 2);
J = S / (2*m);

答案 1 :(得分:25)

以上答案很完美,但您也可以

H = (X*theta);
S = sum((H - y) .^ 2);
J = S / (2*m);

而不是计算

(theta' * X')'

然后进行转置你可以直接计算

(X * theta)

效果很好。

答案 2 :(得分:7)

以下行返回所需的32.07成本值,而我们运行computeCost一次使用θ初始化为零:

J = (1/(2*m)) * (sum(((X * theta) - y).^2));

,类似于下面给出的原始公式。

enter image description here

答案 3 :(得分:1)

它也可以在一行中完成 - m-#训练集

J=(1/(2*m)) * ((((X * theta) - y).^2)'* ones(m,1));

答案 4 :(得分:0)

J = sum(((X*theta)-y).^2)/(2*m);
ans =  32.073

以上答案是完美的,我认为这个问题深深困扰了一天,并且仍然不熟悉Octave,所以,只是一起学习!

答案 5 :(得分:0)

如果只想使用矩阵,那么:

temp = (X * theta - y);        % h(x) - y
J = ((temp')*temp)/(2 * m);
clear temp;

答案 6 :(得分:0)

function J = computeCost(X, y, theta)

m = length(y);

J = 0;

% Hypothesis h(x)
h = X * theta;

% Error function (h(x) - y) ^ 2
squaredError = (h-y).^2;

% Cost function
J = sum(squaredError)/(2*m);

end

答案 7 :(得分:0)

这对您来说很好-

J =  sum((X*theta - y).^2)*(1/(2*m))

这直接来自成本函数方程

答案 8 :(得分:0)

相同的Python代码:

def computeCost(X, y, theta):
    m = y.size  # number of training examples
    J = 0
    H = (X.dot(theta))
    S = sum((H - y)**2);
    J = S / (2*m);
    return J

答案 9 :(得分:-3)

我认为我们需要使用迭代来进行成本而不是一次迭代的一般解决方案,而且PDF 32.07中显示的结果可能不正确答案,因为评分者正在寻找原因是许多训练数据中的一例。

我认为它应该像这样循环

  for i in 1:iteration
  theta = theta - alpha*(1/m)(theta'*x-y)*x

  j = (1/(2*m))(theta'*x-y)^2