当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《成本函数,线性回归,试图避免硬编码theta.八度.》经验,为你挑选了3个好方法。

我正在通过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值吗?

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



1> Simplex..:

您可以在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);


矩阵中的点用于逐元素操作.例如:A = [1 2; 3 4] B = [3 4; 1 2]所以,A*B = [5 8; 13 20](即通常矩阵乘法)A.*B = [3 8; 3 8](即逐元素乘法 - [1*3 2*4; 3*1 4*2]同样:A ^ 2 = [1 ^ 2 2 ^ 2; 3 ^ 2 4 ^ 2] = [1 4; 9 16]

2> 小智..:

以上答案是完美的,但你也可以这样做

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

而不是计算

(theta' * X')'

然后采取转置你可以直接计算

(X * theta)

它完美地运作.


令我困惑的是,在H(x)的等式中,我们得到H(x)= theta'*X,但似乎在代码中实现它时我们必须采用它的转置,但为什么
@ rasen58如果有人仍在关心这个问题,那么在尝试实现这一点时我遇到了同样的问题.基本上我发现的是,在成本函数方程中我们有'*'x.当我们实现函数时,我们没有x,我们有特征矩阵X. x是一个向量,X是一个矩阵,其中每一行是一个向量x转置.所以,这就是额外转置操作的来源.
需要明确的是,上述等式X*theta =(theta'*X')'由于两个身份而成立:(A')'= A和A'*B'=(BA)'.所以只需取(theta'*X')=(X*theta)'这个,转置,给出((X*theta)')'等于X*theta.

3> user3352632..:

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

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

并且类似于下面给出的原始公式.

在此输入图像描述

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有