【问题标题】:Trying to Implement Gradient Descent Algorithm with Fixed Step Size尝试实现固定步长的梯度下降算法
【发布时间】:2021-05-10 07:44:30
【问题描述】:

我正在尝试在 MATLAB 上实现具有固定步长的梯度下降算法。\

syms x1 x2 x3 x4
f(x1,x2,x3,x4) = (x1+10*x2)^2 + 5*(x3-x4)^2 + (x2-2*x3)^4 + 10*(x1-x4)^4 ;
grad_f = gradient(f);
xk = [3;-1;0;1];
while euclidian(grad_f(xk(1),xk(2),xk(3),xk(4)),4) > 0.01
    xk = xk- 0.001*grad_f(xk(1),xk(2),xk(3),xk(4));
    double(xk)
end

这是主要部分,以下是欧几里得范数函数:

function euclidian_norm = euclidian (x,size)
    total = 0;
    for i = 1:size
        total = total + x(i)^2;
    end
    euclidian_norm = sqrt(total);
end

但是,当我尝试运行代码时,它需要永远计算它。我不知道为什么。
提前致谢

编辑: 谁能尝试运行代码并告诉我是否出现同样的问题?

【问题讨论】:

  • 尝试调试看看会发生什么。

标签: algorithm matlab gradient


【解决方案1】:

将问题框定为向量点积,以利用 MATLAB 的内置线性代数例程,这些例程比显式循环快得多:

function euclidean_norm = euclidean(x)
    euclidean_norm = x' * x;
end

您不需要size 参数(即使在您现有的代码中,在函数内计算它而不是要求调用者计算并传递它也不太容易出错)。

我认为这甚至不需要是一个单独的函数,但它没有害处。

【讨论】:

  • 非常感谢。我认为规范函数可能是缓慢的原因;因此,尝试编写我自己的函数。顺便问一下,如果 * 用于点积,我们如何进行正常的矩阵乘法?
  • 不客气 :) 点积 正态矩阵乘法(行向量乘列向量)。顺便说一句,如果您发现我的回答有帮助,您可以投票和/或将其标记为已接受。
  • 嘿,当我实现你提到的欧几里得时,代码仍然运行缓慢,比以前更快。有什么可以让代码更快的吗?
  • 您可以只计算grad_f(xk(1),xk(2),xk(3),xk(4) 每次迭代一次而不是两次。否则,不是我能看到的。我刚刚注意到您似乎在使用某种符号计算 (syms...)。我对此并不熟悉,但直接使用向量和矩阵进行计算可能会更快。还有什么让您期望它更快?
  • 嘿。我找到了原因。原因是象征性的表达。当我把符号表达式拿出来时,它变得更快了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 2016-09-25
  • 2014-03-14
  • 2021-06-19
相关资源
最近更新 更多