当前位置:   article > 正文

梯度下降法浅思_局部最优点的函数为0则为全局最优点

局部最优点的函数为0则为全局最优点

梯度下降法:

已一元二次为例,保证该函数是凸函数(凸函数即局部最优点一定是全局最优点)

这样一个函数 f(x),我们想求得 f(x)=0 的解。

给定一个初值 x0 ,找出此点的梯度方向,沿着梯度的反方向一步步走下去,当走到 x7 时,梯度已经趋于0,我们便找到了解。

但实际上我们求得的梯度是有大小的,很容易走的步子太大或太小,为了便于控制,我们将梯度单位化,只保留方向。

dk=grad(xk)/norm(grad)  ,norm是求出它的值  (例子 (-4/4=-1)这样便只保留了方向,然后我们再给它加上一个步长

step.这时候每次走的长度就可以控制了。

算法过程:

  1. 给定初值 x,误差err, 步长
  2. dk=grad(xk)/norm(grad)
  3. xk+1=xk+stepdk
  4. 如果norm(grad)<err了,xk+1就是解,否则继续。

 

 

用梯度下降法求函数f(x)=0

f(x)是一个函数的话,那么找到解,这个解的梯度应当为0,可是我用梯度小于误差err作为循环终止条件时,却总得不到 正确结果,想了想,可能总是得到了局部最优解了。

例子:f(x)=x*e^(x),q求f(x)=0;

  1. clear all;clc;
  2. x=[5]';err=0.000005;learn=0.0004;
  3. grad=g(x);
  4. %while(f(x)>err)
  5. while(norm(grad)>err)
  6. x=x-learn*(grad/norm(grad))
  7. grad=g(x);
  8. end
  9. function[gx]=g(x)
  10. n=length(x);
  11. dt=1e-8;
  12. I=eye(n);
  13. fx=f(x);
  14. for i=1:n
  15. gx(i)=(f(x+dt*I(:,i))-fx)/dt;
  16. end
  17. gx=gx(:);
  18. end
  19. function[fx]=f(x)
  20. fx=x*exp(x)-1;
  21. end

得到的结果:

很明显不对,画图看看。可以看到在x=-1是梯度的确趋于0,但是真正的解却在0.5左右。

我们再用 f(x)>err作为终止条件

此时得到一个近似解,与图中相符合。

而当 f(x)=x1+x2^2-7时,整个程序更是停不下来,原因是有一个梯度始终为 1,所以我觉得终止条件还是 f(x)>err好一点

但是如果误差设置的小而最小值却高于误差,那么程序便不会终止。

 

所以梯度下降法使用的函数一定要是凸函数,便可以用 where(norm(grad)>err)了。

附上完善的代码:

  1. clear all;clc;
  2. x=[1,1]';%初始化x
  3. err=input('误差,err=');%所要求的误差
  4. step=input('步长,step=');%步长
  5. cnt=0;
  6. grad=g(x);%g(x)是在点x处的梯度
  7. while(norm(grad)>err)
  8. x=x-step*(grad/norm(grad));
  9. grad=g(x);
  10. cnt=cnt+1;
  11. end
  12. disp('');x
  13. disp('迭代次数');cnt
  14. function[gx]=g(x)%g(x)函数求在x处的梯度
  15. n=length(x);% x变量的个数
  16. dt=1e-8;
  17. I=eye(n);
  18. fx=f(x);
  19. for i=1:n
  20. gx(i)=(f(x+dt*I(:,i))-fx)/dt;
  21. end
  22. gx=gx(:);
  23. end
  24. function[fx]=f(x)%f(x)函数
  25. fx=x(1)-x(2)+2*x(1)*x(1)+2*x(1)*x(2)+x(2)*x(2);
  26. end

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/104008?site
推荐阅读
相关标签
  

闽ICP备14008679号