使用fmin_powell的optimalizacja,只有正参数

时间:2017-03-31 05:03:42

标签: python scipy

我一直在尝试使用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

我做错了什么?

1 个答案:

答案 0 :(得分:0)

虽然从表面上看,通过将成本函数设置为较高值来限制搜索空间似乎是一个好主意,但这种方法有一些缺点。

  1. 您需要确保此值在成本函数中占主导地位。
  2. 优化程序知道禁止范围。它只是看到了高昂的成本,但这并不妨碍它去那里。
  3. 您正在成本函数中创建一个平台。当优化器运行到禁区时,它可能不知道如何离开,因为该函数在每个方向看起来都一样。
  4. 通常,最好使用有界或约束优化器。这样算法知道它可能不会去的地方。通常我使用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