我正在尝试使用scipy Nelder-Mead单面搜索函数来查找非线性函数的最小值。看来我的单纯形卡住了,因为它以太小的初始单纯形开始。不幸的是,我在scipy中看不到可以更改某些单纯形参数(例如,初始单纯形大小)的地方。有办法吗?我想念什么吗?还是有NM单工的其他实现?
谢谢
最佳答案
对于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:简单但非常依赖问题。)
您有多少个变量,您的函数有多吵?
希望这可以帮助
关于python - scipy优化-fmin Nelder-Mead单纯形,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9788378/