尝试实现固定步长的梯度下降算法
Trying to Implement Gradient Descent Algorithm with Fixed Step Size
我正在尝试在 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
但是,当我尝试 运行 代码时,它需要永远计算它。我不知道为什么。
提前致谢
编辑:
任何人都可以尝试 运行 代码并告诉我是否出现同样的问题?
将问题构建为向量点积以利用 MATLAB 的内置线性代数例程,这比显式循环快得多:
function euclidean_norm = euclidean(x)
euclidean_norm = x' * x;
end
您不需要 size
参数(即使在您现有的代码中,在函数内计算它而不是让调用者计算并传递它更不容易出错)。
我认为这甚至不需要是一个单独的函数,但它没有坏处。
我正在尝试在 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
但是,当我尝试 运行 代码时,它需要永远计算它。我不知道为什么。
提前致谢
编辑: 任何人都可以尝试 运行 代码并告诉我是否出现同样的问题?
将问题构建为向量点积以利用 MATLAB 的内置线性代数例程,这比显式循环快得多:
function euclidean_norm = euclidean(x)
euclidean_norm = x' * x;
end
您不需要 size
参数(即使在您现有的代码中,在函数内计算它而不是让调用者计算并传递它更不容易出错)。
我认为这甚至不需要是一个单独的函数,但它没有坏处。