gpt4 book ai didi

python - 使用带有时间序列数据的 pandas 数据框作为 SciPy 优化的基础

转载 作者:太空宇宙 更新时间:2023-11-03 16:57:16 25 4
gpt4 key购买 nike

我有一个数据框(dfA)。数据帧 dfB、dfP 和 dfR 应通过优化计算。使用 ScipPy minimize,我试图找到 dfB 和 dfP 的值,其中 dfR 中的残差之和最小。 (dfR=dfA-(dfB+dfP))

dataA ={'LP1':[10,20,30,40,50,60,70]}   #values for dfA
dataB ={'b':[5,5,5,5,5,5,5]} #dummy values for dfB
dataP ={'p':[3,3,3,3]} #dummy values for dfP

dfA = pd.DataFrame(dataA, columns=['LP1'], index=[1,2,3,4,5,6,7])
dfB = pd.DataFrame(dataB, columns=['b'], index=[1,2,3,4,5,6,7])
dfP = pd.DataFrame(dataP, columns=['p'], index=[3,4,5,6])

我设置了以下约束:

    #defining constraints
cons = (
{'type': 'ineq', 'fun': lambda x: x[0] + x[1] - int(dfA.max())}, # sum of b and p not greater than max amount of dfA
{'type': 'ineq', 'fun': lambda x: x[0]}, # x[0] 0 or higher
{'type': 'ineq', 'fun': lambda x: x[1]}, # x[1] 0 or higher
{'type': 'ineq', 'fun': lambda x: x[0]-100}, # x[0] < 100
{'type': 'ineq', 'fun': lambda x: x[1]-100}, # x[1] <100
)

我定义了优化函数如下:

    def optGoal(b, p, dfA, dfB, dfP):

dfB['b'] = b # set df Values to b, constant value for all existing indices
dfP['p'] = p # set df Values to p, constant value for all existing indices

dfR = dfA['LP1'] - (dfB['b'].add(dfP['p'], fill_value=0)) # df Residual = df Profile - (dfB + dfP) but fill the NAN values --- dfB['b'].add(dfP['p'], fill_value=0)
return dfR.sum()

我将最小化称为如下:

  print spo.minimize(lambda x: optGoal(x[0], x[1], dfA, dfB, dfP), [0,0], method='COBYLA', constraints = cons, options={'maxiter':50000})      # optimization and printing result

但是优化运行没有成功:

      status: 2
nfev: 50000
maxcv: 0.0
success: False
fun: -402779.92870763224
x: array([ 43388.11278667, 24835.78480024])
message: 'Maximum number of function evaluations has been exceeded.'

因此,我希望获得 dfB(索引 1 到 7)和 dfP(索引 3 到 6)的值,从而得出残差的最小总和 (dfR)。

与最初创建 dfB 和 dfP 一样,dfB 中应有一个值覆盖索引 1 至 7,dfP 中应有一个值覆盖索引 3 至 6。

你能帮我解决我在这里做错的事情吗?

最佳答案

你的目标函数在两个变量上都在下降,b 上的斜率更陡,所以为了最小化它,你必须尽可能地增加 b,然后如果你还有一些余量(你没有),则增加 p。这给你 b=dfA.max(), p=0 作为最小化函数的值。使用计算机来完成此任务就像使用大锤敲碎坚果一样。但我离题了。

您的限制与您的意图不符(如评论中所述)。你想要这个:

cons = (
{'type': 'ineq', 'fun': lambda x: int(dfA.max()) - x[0] - x[1]}, # sum of b and p not greater than max amount of dfA
{'type': 'ineq', 'fun': lambda x: x[0]}, # x[0] 0 or higher
{'type': 'ineq', 'fun': lambda x: x[1]}, # x[1] 0 or higher
{'type': 'ineq', 'fun': lambda x: 100 - x[0]}, # x[0] < 100
{'type': 'ineq', 'fun': lambda x: 100 - x[1]}, # x[1] < 100
)

使用这些约束,您对 spo.minimize() 的调用可以很好地近似解决方案:

  status: 1
nfev: 99
fun: -210.0
message: 'Optimization terminated successfully.'
x: array([ 7.00000000e+01, -1.73472348e-18])
maxcv: 1.7347234759768071e-18
success: True

令我惊讶的是计算出的解决方案不在可行区域内。我一般不熟悉 scipy 优化或数值优化,所以我不知道这是否是预期的。嗯,我想是的。

关于python - 使用带有时间序列数据的 pandas 数据框作为 SciPy 优化的基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35321435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com