为什么我的最小搜索(最陡的下降)爬上山?

时间:2011-07-06 06:04:55

标签: wolfram-mathematica gradient mathematical-optimization minimization

我正在尝试使用最陡的方法来最小化离散化函数。这应该是相当简单的,但我在搜索“爬出”任何局部最小值时遇到了麻烦。这是我在Mathematica中的代码,但其语法很容易理解。

x = {some ordered pair as a beginning search point};
h = 0.0000001; (* something rather small *)
lambda = 1;
While[infiniteloop == True,
  x1 = x[[1]];
  x2 = x[[2]];
  x1Gradient = (f[x1-h,x2]-f[x1+h,x2])/(2h);
  x2Gradient = (f[x1,x2-h]-f[x1,x2+h])/(2h);
  gradient = {x1Gradient,x2Gradient};

  (* test if minimum is found by normalizing the gradient*)
  If[Sqrt[x1Gradient^2 + x2Gradient^2] > 0.000001,
    xNew = x + lambda*g,
    Break[];
  ];

  (* either pass xNew or reduce lambda *)
  If[f[xNew[[1]],xNew[[2]]] < f[x1,x],
    x = xNew,
    lambda = lambda/2;
  ];
];

为什么要爬山?我很困惑,因为我甚至测试新值是否小于旧值。我不会传递它!想法?

3 个答案:

答案 0 :(得分:3)

来自无约束优化教程,第4页:(可在:http://www.wolfram.com/learningcenter/tutorialcollection/获得)

  

“最陡下降确实是局部最小化的可能策略,但它通常不会快速收敛。在此示例的后续步骤中,您可能会注意到搜索方向与轮廓不完全垂直。搜索使用的是信息从过去的步骤来尝试获得有关函数曲率的信息,这通常会给它一个更好的方向。另一种策略,通常收敛速度更快,但可能更昂贵,是使用函数的二阶导数。通常被称为牛顿的“方法”。

对我来说,这个想法似乎是“走错路”有助于算法学习“正确的方法” - 并提供有关函数曲率的有用信息,以指导后续步骤。

HTH ......如果没有,请查看Constrained和Unconstrained Tutorials。很多有趣的信息。

答案 1 :(得分:2)

你的渐变是负面的。使用

 x1Gradient = (f[x1+h,x2]-f[x1-h,x2])/(2h);
 x2Gradient = (f[x1,x2+h]-f[x1,x2-h])/(2h);

答案 2 :(得分:1)

最陡的下降陷入局部最佳状态,使禁忌搜索方面不会陷入局部最佳状态。

有关最陡上升(=最速下降)和禁忌搜索的算法,请参阅this book