【问题标题】:scipy.optimize.minimize for constrained optimization in pythonscipy.optimize.minimize 用于 python 中的约束优化
【发布时间】:2017-06-14 23:31:37
【问题描述】:

在下面的问题中,我使用scipy.optimize.minimize 函数来解决一个有 5 个参数的约束优化问题,名为params。当我在 Python 中调试我的脚本时,最佳参数返回一个包含 5-nan 元素的向量。有什么想法吗?

from scipy.optimize import minimize

xdata = np.arange(0, 17.5, 0.125)*0.1
xdata= xdata[60:85]
ydata = 1.0/xdata

plt.plot( xdata, ydata , 'ro', label='data')
plt.show()

def getvar(xobs, params) :
    yobs = np.asarray( [0.0]*len(xobs) )
    for i in range(len(xobs)):
        yobs[i] = params[0] + params[1] *(params[2]*(  math.log(xobs[i]) - params[3] ) +  math.sqrt( ( math.log(xobs[i]) - params[3]   )**2 + params[4]**2)  )
    return yobs

def resi(params):
    return getvar(xdata, params) - ydata


def sum_resi(params) :
    return sum( resi(params)**2 )

#Unconstrained
guess = np.asarray( [1.0,1.0,1.0,1.0,1.0] )
pwithout,cov,infodict,mesg,ier=scimin.leastsq(resiguess,full_output=True)

ylsq = getvar( xdata, pwithout)
plt.plot(xdata, ylsq,  'b--', label='fitted plot')
plt.show()

#Constrained: Use the guess from the unconstrained problem

cons = ( {'type': 'ineq','fun' : lambda params: np.array([params[0]       +   params[1]*params[4]* math.sqrt( 1 - params[2]**2 ) ]  )})
bnds = ( (None, None), (0, None), (-1,1),(None, None),(0, None) )
pwith=scimin.minimize(sum_resi,pwithout, method='SLSQP', bounds=bnds,
    constraints=cons, options={'disp': True})
ylsqconst = getvar( xdata, pwith.x) 
plt.plot(xdata, ylsqconst,  'g--', label='fitted plot')
plt.show()

注意事项

您可以在每次迭代中看到所有参数都满足条件。在 i) 定义约束的行:cons = ( {'type': 'ineq','fun'... 和在 ii) 返回残差总和的行:return sum(resi(params)**2 ) 设置调试点。如果您能看到我看不到的错误,请告诉我。

【问题讨论】:

  • 修复错别字和缺少导入后,我没有收到nans。我得到[-0.67014471 1.64436994 -0.91324285 -0.43218748 1.34249085],非常类似于无约束的解决方案...

标签: python optimization scipy least-squares nonlinear-optimization


【解决方案1】:

我认为这个问题可能是一个简单的错字。在行中

pwithout,cov,infodict,mesg,ier=scimin.leastsq(resiguess,full_output=True)

不应该是leastsq(resi, guess, ...)吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-10
    • 2017-11-13
    • 1970-01-01
    • 2016-06-08
    • 2015-01-02
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多