我一直在尝试使用fmin_powell方法优化系数。 我希望优化器只检查正值。因此我添加了条件是否有任何参数为负 - 返回100000000.0
coeff = np.array([1.,1.,1.,1.])
def run(coeff, *func):
if (coeff[0] or coeff[1] or coeff[2] or coeff[3]) < 0: return 100000000.0
else:
[some math operations]
return Energy
def optimize(f):
return opt.fmin_powell(run, coeff, args=(f,f), disp=0)
f = ['1a','2b','3c', '4d', '5e', '6e', '7f', '8g']
p = Pool(processes=8)
async_ret = p.map(optimize,f,chunksize=1)
result = async_ret.get()
p.terminate()
无论如何,我写下了一个条件,我得到的是否定值:
[ 1. 1. 1. 1.]10.1985596621
[ 1. 1. 1. 1.]10.1985596621
[ 2. 1. 1. 1.]10.2100842541
[ 1. 1. 1. 1.]10.1985596621
[ 0.38196603 1. 1. 1. ]10.1822540716
[ 0.14589804 1. 1. 1. ]10.1678012695
[ 0.0557281 1. 1. 1. ]10.1563797355
[ 0.02128625 1. 1. 1. ]10.1480644959
[ 0.01000002 1. 1. 1. ]10.1433906566
[ 1.55472633e-08 -6.18034000e-01 1.00000000e+00 1.00000000e+00]10.1319877158
[ 1.55472633e-08 -3.23606803e+00 1.00000000e+00 1.00000000e+00]10.1319475286
我做错了什么?
答案 0 :(得分:0)
虽然从表面上看,通过将成本函数设置为较高值来限制搜索空间似乎是一个好主意,但这种方法有一些缺点。
通常,最好使用有界或约束优化器。这样算法知道它可能不会去的地方。通常我使用scipy.optimize.minimize
并让它根据它获得的信息(成本函数,导数,边界,约束)自动选择要使用的优化算法。
但是,如果您确实需要使用不采用边界或约束的特定优化算法,则可以通过使成本函数向正值倾斜来帮助其返回可行区域。例如:
if (coeff[0] or coeff[1] or coeff[2] or coeff[3]) < 0:
return (np.minimum(coef, 0)**2 + 1) * 100000000.0