Wolfram mathematica 为什么我的最小搜索(最陡峭的)会爬山?
我试图用最陡下降法最小化离散化函数。这应该相当简单,但我在搜索“爬升”到任何局部最小值时遇到了麻烦。这是我在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]];
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);
最速下降陷入局部最优,使其上的禁忌搜索方面不会陷入局部最优
请参见最速上升=最速下降和禁忌搜索的算法示例。最速下降陷入局部最优,启用禁忌搜索功能以避免陷入局部最优
请参阅最陡上升=最陡下降和禁忌搜索的算法示例。好的,但我会注意这一点,因为我将梯度添加到上一点。错误的符号仍然是一个问题。你走错方向了。你的方法走下坡路。这只是一个符号差异。因为我有一个负梯度,我只是把它加到旧的点上,得到新的点。说斜率真的是正的。我想朝着消极的方向走。所以我改变了坡度的符号,把它加到点上,得到下一个点。好的,但我会注意,因为我把坡度加到上一个点上。错误的符号仍然是个问题。你走错方向了。你的方法走下坡路。这只是一个符号差异。因为我有一个负梯度,我只是把它加到旧的点上,得到新的点。说斜率真的是正的。我想朝着消极的方向走。所以我改变了坡度的符号,把它加到点上,得到下一个点。