我正在尝试使用scipy Nelder-Mead单纯形搜索函数来找到一个非线性函数的最小值。我的单纯形似乎被卡住了,因为它从太小的初始单纯形开始。不幸的是,我在scipy中看不到任何地方可以更改一些单形参数(例如初始单形大小)。有什么办法吗?我是不是遗漏了什么?还有没有其他的NM单工实现?
谢谢
发布于 2012-03-27 22:49:21
给内尔德-米德的两个建议:
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之后的func()值也不是个坏主意,以了解neard1()在那里是什么样子。
如果有任何邻居比N-M“最好”,则从新的单形重新启动N-M。(可以替换neard1、N-M、neard1、N-M:很简单,但非常依赖于问题。)
你有多少个变量,你的函数有多嘈杂?
希望这能有所帮助
发布于 2012-03-20 22:28:55
来自http://docs.scipy.org/doc/的参考资料
方法内德-米德使用单纯形算法R123,R124。该算法已经在许多应用中取得了成功,但通常情况下,使用一阶和/或二阶导数信息的其他算法可能会因为其更好的性能和鲁棒性而被首选。
然后,建议使用完全不同的算法。请注意:
方法BFGS使用Broyden,Fletcher,Goldfarb和Shanno (BFGS)的准牛顿方法R127第136页。它只使用一阶导数。BFGS已被证明具有良好的性能,即使对于非平滑优化也是如此。此方法还返回海森逆的近似值,存储为OptimizeResult对象中的hess_inv。
总的来说,BFGS听起来更健壮,速度更快。
ParagonRG
https://stackoverflow.com/questions/9788378
复制相似问题