我正在尝试使用scipy Nelder-Mead单纯形搜索功能来找到非线性函数的最小值。看起来我的单纯形卡被卡住了,因为它开始于一个太小的初始单纯形。不幸的是,我没有在scipy的任何地方看到你可以改变一些单面参数(例如初始单面大小)。有办法吗?我错过了什么吗?或者还有其他NM单纯形的实现吗?
由于
答案 0 :(得分:2)
对Nelder-Mead的两点建议:
1)将所有x
对齐到网格中,例如.01,在函数内:
x = np.round( x / grid ) * grid
f = ...
这可以作为高维度的简单噪声滤波器 (在2d或3d中,不要打扰)。
2)从2d + 1附近点的最佳d + 1开始, 而不是通常的d + 1:
def neard1( func, x, h, verbose=1 ):
""" eval func at 2d+1 points x, x +- h
sort
-> f[ d+1 best values ], X[ d+1 ]
to start or restart Nelder-Mead
"""
dim = len(x)
I = np.eye(dim)
np.fill_diagonal( I, h ) # scalar or vec
X = x + np.vstack(( np.zeros(dim), I, - I ))
fnear = np.array([ func( x ) for x in X ]) # 2d+1
f0 = fnear[0]
up = np.argsort( fnear ) # vec func: |fnear|
if verbose:
print "neard1: f %g +- %s around x %s" % (
f0, fnear[up] - f0, x )
bestd1 = up[:dim+1]
return fnear[bestd1], X[bestd1]
在Nelder-Mead之后查看neard1()值也不是一个坏主意,
了解func()的含义。
如果任何邻居比N-M“最好”更好,则从该新单纯重启N-M。
(可以替代neard1,N-M,neard1,N-M:容易但非常依赖于问题。)
你有多少变量,你的功能有多吵?
希望这有帮助
答案 1 :(得分:1)
来自http://docs.scipy.org/doc/的参考:
方法Nelder-Mead使用Simplex算法[R123],[R124]。该算法在许多应用中已经取得了成功,但使用第一和/或第二衍生信息的其他算法可能因其更好的性能和稳健性而受到青睐。
然后,建议使用完全不同的算法。请注意:
方法BFGS使用Broyden,Fletcher,Goldfarb和Shanno(BFGS)[R127] pp.136的准牛顿方法。它仅使用一阶导数。即使对于非平滑优化,BFGS也表现出良好的性能。此方法还返回Hessian逆的近似值,在OptimizeResult对象中存储为hess_inv。
BFGS听起来更强大,整体更快。
ParagonRG