我正在通过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值吗?
如果您需要更多信息来了解我想要提出的问题,我会尽力提供.
您可以在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);
以上答案是完美的,但你也可以这样做
H = (X*theta); S = sum((H - y) .^ 2); J = S / (2*m);
而不是计算
(theta' * X')'
然后采取转置你可以直接计算
(X * theta)
它完美地运作.
下面的行返回所需的32.07成本值,而我们运行computeCost一次使用θ初始化为零:
J = (1/(2*m)) * (sum(((X * theta) - y).^2));
并且类似于下面给出的原始公式.