【发布时间】:2016-01-31 23:41:24
【问题描述】:
我想用 scipy.optimize.minimize 中的“COBYLA”方法解决一个优化问题,如下所示:
test = spopt.minimize(testobj, x_init, method='COBYLA', constraints=cons1)
y = test.x
print 'solution x =', y
但是,由于程序非常大,编写目标函数(和约束)的可扩展方式是使用参数的通用索引。例如,如果我可以使用x['parameter1'] 或x.param1 而不是x[0],那么程序将更易于阅读和调试。我尝试将x 写为对象或使用x['parameter1'] 之类的通用索引编写pandas Series,如下所示:
def testobj(x):
return x['a']**2 + x['b'] + 1
def testcon1(x):
return x['a']
def testcon2(x):
return x['b']
def testcon3(x):
return 1 - x['a'] - x['b']
x_init = pd.Series([0.1, 0.1])
x_init.index = ['a','b']
cons1 = ({'type': 'ineq', 'fun': testcon1}, \
{'type': 'ineq', 'fun': testcon2}, \
{'type': 'ineq', 'fun': testcon3})
但每当我将它传递给minimize 例程时,它都会引发错误:
return x['a']**2 + x['b'] + 1
ValueError: field named a not found
如果我使用普通的 numpy 数组,它会完美运行。也许我做得不对,但这是我必须使用 numpy 数组而不是任何其他数据结构的最小化函数的限制吗? this topic 上的 scipy 文档提到初始猜测必须是 ndarray,但我很好奇例程如何调用参数,因为对于 pandas Series,使用 x[0] 或 x['a'] 调用变量是等效的。
【问题讨论】:
-
您可以为您的参数向量编写一个对象包装器并在您的计算中使用它。
-
当我在谷歌上搜索对象包装器时,有没有可以借鉴的小例子?
标签: optimization pandas indexing scipy minimize