【问题标题】:Solving a bounded non-linear minimization with scipy in python在 python 中用 scipy 解决有界非线性最小化
【发布时间】:2014-10-05 20:35:16
【问题描述】:

试图用一个变量解决一个简单的非线性最小化问题。

from scipy.optimize import minimize
import math

alpha = 0.05
waiting = 50
mean_period = 50
neighborhood_size = 5

def my_func(w):
    return -(2/(w+1) + alpha*math.floor(waiting/mean_period))*(1-(2/(w+1) + alpha*math.floor(waiting/mean_period)))**(neighborhood_size-1)

print minimize(my_func, mean_period, bounds=(2,200))

这给了我

ValueError: length of x0 != length of bounds

我输入错了吗?我应该如何格式化?

如果我删除边界,我会得到:

status: 2
  success: False
     njev: 19
     nfev: 69
 hess_inv: array([[1]])
      fun: array([-0.04072531])
        x: array([50])
  message: 'Desired error not necessarily achieved due to precision loss.'
      jac: array([-1386838.30676792])

函数看起来像that,因此我需要边界来将解限制在我感兴趣的局部最大值内。

【问题讨论】:

  • 你能试试 bounds=((2,200),) 吗?
  • @ambi ,实际上解决了它。我想我在第一次尝试时打错了。一个快速反问:来自 C 背景,很容易从函数签名中确定参数的类型。在那种情况下,新用户如何知道它需要一个元组而不实际查看源 (github.com/scipy/scipy/blob/v0.14.0/scipy/optimize/…)?

标签: python optimization scipy nonlinear-optimization minimization


【解决方案1】:

应该是:

print minimize(my_func, mean_period, bounds=((2,200),))

  status: 0
 success: True
    nfev: 57
     fun: array([-0.08191999])
       x: array([ 12.34003932])
 message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
     jac: array([  2.17187379e-06])
     nit: 4

您必须为每个参数提供一个界限,因此这里我们需要将一个仅包含一个tuple (2,200)tuple 传递给minimize()

【讨论】:

  • 正如我在上面的评论中提到的,我来自 C 背景,很容易从函数签名中确定参数的类型。在这种情况下,新用户如何知道它需要一个元组而不实际查看源 (github.com/scipy/scipy/blob/v0.14.0/scipy/optimize/…)?
  • @George 不幸的是,Python 中的问题之一是很难看出函数接受什么类型。通常需要文档来说明这一点——在最小化()的文档中说 bounds 是一个“序列” - 它没有指定元组的原因是因为这实际上适用于任何可迭代对象,例如它可能是一个列表。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2021-01-04
  • 2019-01-21
相关资源
最近更新 更多