使用scipy进行优化

时间:2015-03-24 10:11:43

标签: python optimization scipy minimize

在以下脚本中:

import numpy as np
from scipy.optimize import minimise

a=np.array(range(4))
b=np.array(range(4,8))

def sm(x,a,b):
      sm=np.zeros(1)
      a=a*np.exp(x)
      sm += sum(b-a)
      return sm

 x0=np.zeros(4)
 print sm(x0,a,b) #checking my function

 opt = minimize(sm,x0,args=(a,b),method='nelder-mead', 
 options={'xtol': 1e-8,     'disp': True})        

我正在尝试优化x,但我收到以下消息:

  

警告:已超出最大功能评估次数。

结果是:

  

数组([ - 524.92769674,276.6657959,185.98604937,729.5822923])

哪个不是最佳选择。 我的问题是我有这个消息和结果,因为我的出发点不正确吗?

2 个答案:

答案 0 :(得分:1)

您的功能sm似乎无限制。当你增加x时,sm会变得越来越负面,因此它会转到-inf

Re:评论 - 如果您想让sm()尽可能接近零,请修改函数定义中的最后一行以阅读return abs(sm)

这最小化了函数的绝对值,使其接近于零。

您的示例的结果:

>>> opt = minimize(sm,x0,args=(a,b),method='nelder-mead', options={'xtol': 1e-8,     'disp': True})
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 153
         Function evaluations: 272
>>> opt
  status: 0
    nfev: 272
 success: True
     fun: 2.8573836630130245e-09
       x: array([-1.24676625,  0.65786454,  0.44383101,  1.73177358])
 message: 'Optimization terminated successfully.'
     nit: 153

答案 1 :(得分:1)

修改了FuzzyDuck的提议,我替换了sm + =((b-a)** 2),它返回了我想要的结果。