为什么我在这里收到自动广播警告?

时间:2013-10-24 15:48:38

标签: warnings octave mathematical-optimization

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

这是我的作业,但我不要求你为我做这件事(我实际上认为我已经做过或接近过)。我在提到播放的地方给了红色,但我还是不明白,为什么我会在这里收到警告?

2 个答案:

答案 0 :(得分:6)

问题在于size(theta')1 2size(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)

由于警告说广播来自产品操作,因此它将来自违规行中的任何.*。在不知道您给予函数的输入值但假设:

的情况下,我不能说哪一个
  1. X是矢量;
  2. alpha是标量;
  3. theta是一个标量。
  4. 我的猜测是来自X .* (X * theta - y))'的警告,特别是因为您要转置第二部分。尝试删除转置运算符(如果还有其他错误,可能会导致错误 - 我假设您不想执行广播)。