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]
3条答案
按热度按时间hof1towb1#
对Nelder-Mead的两点建议:
1)将所有
x
对齐到函数内部的网格,比如.01:这在高维中充当简单的噪声过滤器(在2d或3d中,不用麻烦)。
2)从2d+1个邻近点中最好的d+1个开始,而不是通常的d+1:
查看Nelder-Mead之后的neard 1()值也是个不错的主意,可以了解func()在那里的样子。
如果任何邻居比N-M个“最佳”更好,则从新的单纯形重新开始N-M。(可以交替neard 1,N-M,neard 1,N-M:简单但非常依赖于问题。)
你有多少个变量,你的函数有多嘈杂?
希望这能帮上忙
xpcnnkqh2#
根据http://docs.scipy.org/doc/处的参考:
方法Nelder-Mead使用单纯形算法[R123],[R124]。该算法在许多应用中取得了成功,但使用一阶和/或二阶导数信息的其他算法可能更好,因为它们通常具有更好的性能和鲁棒性。
因此,建议使用完全不同的算法。注意:
方法BFGS使用Broyden、弗莱彻、Goldfarb和Shanno(BFGS)[R127]第136页的准牛顿法。它仅使用一阶导数。BFGS已被证明即使对于非平滑优化也具有良好的性能。此方法还返回Hessian逆的近似值,存储为OptimizeResult对象中的hess_inv。
BFGS听起来更健壮,整体速度更快。
肺动脉高压RG
mwngjboj3#
添加一个更当前的答案以防有人遇到这个问题。
scipy.optimize.minimize()
的最新实现允许你传入一个初始单纯形作为参数。查看文档了解细节。我发现它非常有帮助,因为我也遇到过默认初始单纯形太小的问题。