3
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

这是我的作业,但我不要求你为我做(我实际上认为我已经完成或接近完成)。我已经在手册中提到了广播,但我仍然不明白,为什么我在这里收到警告?

4

2 回答 2

7

问题在于size(theta')is1 2size(X)is m 2

X(1,1)当您将它们相乘时,Octave 从乘以theta'(1,1)和开始X(1,2)theta'(1,2)然后它移动到第二行X并尝试X(2,1)乘以theta'(2,1)。但是theta'没有第二行,所以这个操作没有意义。

Octave 不只是崩溃,而是猜测您打算扩展theta',以便它具有与X开始乘法之前一样多的行。然而,因为它在猜测某些东西,它觉得它应该警告你它在做什么。

repmat在开始与函数相乘之前,您可以通过显式扩展 theta 的长度来避免警告。

repmat(theta',m,1) .* X
于 2015-07-02T23:36:47.127 回答
2

由于警告说广播来自产品操作,因此它将来自.*违规行中的任何一个。在不知道您为函数提供的输入值的情况下,我不能说哪一个,但假设:

  1. X是一个向量;
  2. alpha是一个标量;
  3. theta是一个标量。

我的猜测是警告来自X .* (X * theta - y))'特别是因为您正在转置第二部分。尝试删除转置运算符(如果上面有另一个错误,这可能会导致错误——我假设您不想执行广播)。

于 2013-10-26T07:49:39.813 回答