function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y);
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
## warning: product: automatic broadcasting operation applied
theta = theta - sum(X .* (X * theta - y))' .* (alpha / (m .* 2));
J_history(iter) = computeCost(X, y, theta);
end
end
这是我的作业,但我不要求你为我做这件事(我实际上认为我已经做过或接近过)。我在提到播放的地方给了红色,但我还是不明白,为什么我会在这里收到警告?
答案 0 :(得分:6)
问题在于size(theta')
是1 2
而size(X)
是m 2
。
当您将它们相乘时,Octave首先将X(1,1)
乘以theta'(1,1)
,将X(1,2)
乘以theta'(1,2)
。然后它移动到X
的第二行,并尝试将X(2,1)
乘以theta'(2,1)
。但是theta'
没有第二行,所以操作毫无意义。
Octave猜测你的意思是扩展theta'
,而不是只是崩溃,而是在开始乘法之前它有X
所需的行数。但是,因为它在猜测某些东西,所以它应该警告你它正在做什么。
您可以在使用repmat
function开始乘法之前显式延长theta的长度来避免警告。
repmat(theta',m,1) .* X
答案 1 :(得分:2)
由于警告说广播来自产品操作,因此它将来自违规行中的任何.*
。在不知道您给予函数的输入值但假设:
alpha
是标量; theta
是一个标量。我的猜测是来自X .* (X * theta - y))'
的警告,特别是因为您要转置第二部分。尝试删除转置运算符(如果还有其他错误,可能会导致错误 - 我假设您不想执行广播)。