scipy.optimize.fminbound:设置参数的界限

2024-10-01 15:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用的fminbound函数优化函数scipy.optimize公司模块。我想设置参数边界以使答案在物理上合理(例如,>;0)。在

import scipy.optimize as sciopt
import numpy as np

阵列:

^{pr2}$

当我只使用一个参数时,我设法在参数范围内优化线性函数:

fp   = lambda p, x: x[0]+p*x[1]
e    = lambda p, x, y: ((fp(p,x)-y)**2).sum()
pmin = 0.5 # mimimum bound
pmax = 1.5 # maximum bound
popt = sciopt.fminbound(e, pmin, pmax, args=(x,y))

This results in popt = 1.05501927245

但是,当尝试使用多个参数进行优化时,我收到以下错误消息:

fp   = lambda p, x: p[0]*x[0]+p[1]*x[1]
e    = lambda p, x, y: ((fp(p,x)-y)**2).sum()
pmin = np.array([0.5,0.5]) # mimimum bounds
pmax = np.array([1.5,1.5]) # maximum bounds
popt = sciopt.fminbound(e, pmin, pmax, args=(x,y))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 949, in fminbound
    if x1 > x2:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我试着把e矢量化(np.矢量化)但错误信息保持不变。我知道fminbound需要一个浮点或数组标量作为边界。有没有其他函数可以解决这个问题?在


Tags: lambda函数in参数npscipyarray边界
1条回答
网友
1楼 · 发布于 2024-10-01 15:44:39

fminbound仅用于优化一个变量的函数。在

对于多变量的情况,您应该使用scipy.optimize.minimize,例如

from scipy.optimize import minimize
p_guess = (pmin + pmax)/2
bounds = np.c_[pmin, pmax]  # [[pmin[0],pmax[0]], [pmin[1],pmax[1]]]
sol = minimize(e, p_guess, bounds=bounds)
print(sol)
if not sol.success:
    raise RuntimeError("Failed to solve")
popt = sol.x

相关问题 更多 >

    热门问题