Wolfram mathematica 为什么我的最小搜索(最陡峭的)会爬山?

Wolfram mathematica 为什么我的最小搜索(最陡峭的)会爬山?,wolfram-mathematica,gradient,mathematical-optimization,minimization,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]];

我试图用最陡下降法最小化离散化函数。这应该相当简单,但我在搜索“爬升”到任何局部最小值时遇到了麻烦。这是我在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;
  ];
];

为什么这会爬山?我很困惑,因为我甚至测试新值是否小于旧值。当它是我不通过的时候!想法?

来自无约束优化教程,第4页:可在:

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

在我看来,“走错方向”似乎有助于算法学习“正确的方向”——并提供有关函数曲率的有用信息,以指导后续步骤


嗯。。。如果没有,请查看约束教程和非约束教程。许多有趣的信息。

来自无约束优化教程,第4页:可从以下网址获得:

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

在我看来,“走错方向”似乎有助于算法学习“正确的方向”——并提供有关函数曲率的有用信息,以指导后续步骤


嗯。。。如果没有,请查看约束教程和非约束教程。很多有趣的信息。

你的梯度是负的。使用

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

你的梯度是负的。使用

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

最速下降陷入局部最优,使其上的禁忌搜索方面不会陷入局部最优


请参见最速上升=最速下降和禁忌搜索的算法示例。

最速下降陷入局部最优,启用禁忌搜索功能以避免陷入局部最优


请参阅最陡上升=最陡下降和禁忌搜索的算法示例。

好的,但我会注意这一点,因为我将梯度添加到上一点。错误的符号仍然是一个问题。你走错方向了。你的方法走下坡路。这只是一个符号差异。因为我有一个负梯度,我只是把它加到旧的点上,得到新的点。说斜率真的是正的。我想朝着消极的方向走。所以我改变了坡度的符号,把它加到点上,得到下一个点。好的,但我会注意,因为我把坡度加到上一个点上。错误的符号仍然是个问题。你走错方向了。你的方法走下坡路。这只是一个符号差异。因为我有一个负梯度,我只是把它加到旧的点上,得到新的点。说斜率真的是正的。我想朝着消极的方向走。所以我改变了坡度的符号,把它加到点上,得到下一个点。