为什么我为Andrew Ng的课程写的不被接受?

时间:2018-05-26 09:06:01

标签: octave gradient-descent

Andrew Ng在Coursera的课程,斯坦福大学的机器学习课程,其特色是编程任务,用于实现课堂上教授的算法。此分配的目标是通过梯度下降实现线性回归,输入集为X, y, theta, alpha (learning rate), and number of iterations

我在Octave中实现了这个解决方案,这是课程中规定的语言。

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y); 
J_history = zeros(num_iters, 1);

numJ = size(theta, 1);

for iter = 1:num_iters

    for i = 1:m

        for j = 1:numJ

            temp = theta(j) - alpha /m *  X(i, j) * (((X * theta)(i, 1)) - y(i, 1));

            theta(j) = temp

        end

        prediction = X * theta;

J_history(iter, 1) = computeCost(X,y,theta) 

 end   

end


另一方面,这是成本函数:

function J = computeCost(X, y, theta)

m = length(y); 

J = 0;

prediction = X * theta;

error = (prediction - y).^2;

J = 1/(2 * m) .* sum(error);

end

这不会传递submit()函数。 submit()函数只是通过传递一个未知的测试用例来验证数据。

我已经检查了StackOverflow上的其他问题,但我真的不明白。 :)

非常感谢!

2 个答案:

答案 0 :(得分:2)

您的computecost代码是正确的 并且更好地遵循Gradient Descent的矢量化实现。 你只是在迭代,它很慢,可能有错误。

该课程旨在为您提供矢量化实施,因为它既简单又方便。 我知道这是因为我出汗后做了很多。 矢量化很好:)

答案 1 :(得分:1)

您的渐变似乎是正确的,正如@Kasinath P给出的答案中已经指出的那样,问题可能是代码太慢了。你只需要对它进行矢量化。在Matlab / Octave中,您通常需要避免for循环(请注意,虽然您在Matlab中有parfor,但它在八度音程中尚未提供)。因此,在A*x之类的内容中编写类似A的内容,而不是使用for循环遍历X的每一行,总是更好。您可以阅读有关矢量化here的信息。

如果我理解正确,m*numJ是一个大小为m的矩阵,其中numJ是示例的数量,(1/(2*m)) * (X*theta-y)'*(X*theta-y);%since ||v||_2^2=v'*v for any vector v in Euclidean space 是要素的数量(或维度)每个点所在的空间。在这种情况下,您可以将成本函数重写为

s

现在,我们从基本matrix calculus了解到,对于vR^{num_J}的任何两个向量,R^ms^{t}v的函数,s^{t}Jacobian(v)+v^{t}*Jacobian(s) %this Jacobian will have size 1*num_J. jacobian=(1/m)*(theta'*X'-y')*X; 的雅可比<1}}由

提供
for i = 1:m
    for j = 1:numJ
        %%% theta(j) updates
    end
end

将其应用于您的成本函数,我们获得

%note that the gradient is the transpose of the Jacobian we've computed 
theta-=alpha*(1/m)*X'*(X*theta-y)

所以如果你只是替换

$('.downloadfileexintegradedindb').removeByContent('pasdefichier');​
$('.downloadfileexintegradedindb:contains("pasdefichier")').hide();  //to hide
$('.downloadfileexintegradedindb:contains').find('p:contains("pasdefichier")').remove();

<p class="downloadfileexintegradedindb" id="123456789" style="position: absolute; top: 36px; left: 123px;">pasdefichier</p>

你应该看到性能大幅提升。