成本函数,线性回归,尽量避免硬编码THETA。八度。

问题描述 投票:41回答:7

我在通过Coursera安德鲁吴教授的机器学习课程的第二周。我们正在努力线性回归和我现在正在处理的编码成本函数。

我写的代码正确地解决了这个问题,但没有通过的提交过程和失败的单元测试,因为我已经硬编码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值?

如果您需要更多的信息来了解我想请问一下,我会尽我所能提供的。

machine-learning octave linear-regression
7个回答
72
投票

您可以使用八度/ Matlab的操作的量化。遍历整个向量 - 这是非常糟糕的主意,如果你的语言PROGRAMM让你向量化操作。 R,八度,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);

29
投票

上面的回答是完美的,但你也可以做

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

而不是计算

(theta' * X')'

再服用就可以直接计算出转

(X * theta)

它完美的作品。


10
投票

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

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

而类似于下面给出的原始配方。

enter image description here


2
投票

它可以在一个线 - 间#训练集来也做

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

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

上面的回答是完美的,我想这个问题深深的一天,并与倍频还很陌生,那么,就一起学习!


0
投票

如果你希望只使用矩阵,那么:

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

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

-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
© www.soinside.com 2019 - 2024. All rights reserved.