Octave 为什么我要为Andrew Ng';什么课程不被接受?

Octave 为什么我要为Andrew Ng';什么课程不被接受?,octave,gradient-descent,Octave,Gradient Descent,Andrew Ng的Coursera课程是斯坦福大学的机器学习课程,其特点是编程作业涉及实现课堂上教授的算法。本作业的目标是通过梯度下降实现线性回归,输入集为X、y、θ、alpha(学习率)和迭代次数 我用课程中规定的语言Octave实现了这个解决方案 function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters) m = length(y); J_history = zeros(num_iters,

Andrew Ng的Coursera课程是斯坦福大学的机器学习课程,其特点是编程作业涉及实现课堂上教授的算法。本作业的目标是通过梯度下降实现线性回归,输入集为
X、y、θ、alpha(学习率)和迭代次数

我用课程中规定的语言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的其他问题,但我真的不明白。:)


多谢各位

您的计算成本代码是正确的 更好地遵循梯度下降的矢量化实现。 您只是在迭代,速度很慢,可能会出错

这门课程的目的是让你做矢量化的实现,因为它既简单又方便。 我知道这一点,因为我是在大汗淋漓之后才这么做的。
矢量化很好:)

您的梯度似乎是正确的,正如@Kasinath p给出的答案所指出的,问题可能是代码太慢。你只需要把它矢量化。在Matlab/Octave中,通常需要避免
for
循环(注意,虽然Matlab中有
parfor
,但它在Octave中还不可用)。因此,在性能方面,编写类似
A*x
的代码总是比使用
for
循环迭代
A
的每一行更好。您可以阅读有关矢量化的内容

如果我理解正确,
X
是一个大小为
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 
现在,我们从basic知道,对于任何两个向量
s
v
,它们是从
R^{num_J}
R^m
的函数,
s^{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;
所以如果你只是更换

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


您应该看到性能有了很大的提高。

我没有投反对票,但我同意他们的观点。没有任何上下文,很难帮助您。我们不知道
提交的数据是什么()
函数提供给它。如果你有一些玩具数据,代码会产生不满意/错误的结果,那么请提供或至少描述它。更重要的是,你的梯度是否正确?你没有说成本函数是什么。我们可能可以通过看梯度来猜测,但我个人不会花时间来解释这样做。另外,只是一件小事,你不需要
temp
变量,你可以做
你的θ-=δθ
。同样快速查看代码,用
θ(j)
而不是
θ(1,j)
θ(j,1)索引非单元向量形变量通常是个坏主意
。还有,你有没有尝试过使用步长?最后,我可能弄错了,但如果我是你,我不会用
m标准化梯度,这在这里似乎没有意义。先生@Ash你能给我反馈吗!我真的很感谢你对我更新问题的帮助:)哦。。。请不要叫我先生,我还没那么老呢!:)不过,@Ash,非常感谢!:)观察力好,+1。然而,我认为,如果你增加更多细节并消除杂乱(我不是指粗鲁的方式),比如“矢量化很好”,你可以大大提高你答案的质量。不过,这只是一个观察。
%note that the gradient is the transpose of the Jacobian we've computed 
theta-=alpha*(1/m)*X'*(X*theta-y)