最小化多变量函数,同时函数的某些变量保持不变。常量变量是列表列表

时间:2016-10-27 09:44:18

标签: python optimization scipy minimize

我是python的新手,已经遇到了一个非常复杂的问题(至少对我而言)。我想最小化一个带有多个变量的函数,其中一个变量是一个列表,其中列出了我从模拟中获得的数据。当程序优化其他两个变量时,此列表应保持不变。

https://gist.github.com/anonymous/0acb424f7c6942329918430fb616c040

这是我目前在3个不同文件中的代码。 Simulation.py是计算列表列表的模拟。在Function.py中包含我的函数" Gompertz"我想尽量减少。如您所见,它包含三个变量。在第一个变量中,我想从模拟中列出我的列表("死亡列表")。我想使用Scipy的最小化函数优化其他两个变量。 运行程序会给我以下错误,但我想我的解决方案编码方式总体上有问题。任何帮助,将不胜感激 :)。 (不要担心程序中包含死亡的所有名字。我正在研究死亡率数据)

(编辑:我将边界条件更改为b =(0.001,10))

编辑:澄清Optimize.py是重要的部分。 Simulation.py和Function.py仅用于上下文。我的问题是如何在优化其他两个变量的同时将列表变为优化过程中的常量变量。因此,在Optimize.py文件中,我将列表的边界条件设置为b =(deathlist,deathlist),因此它将保持不变。我不确定这是否正确,如果不正确,我怎么能以不同的方式编写这段代码。

Traceback (most recent call last): File "/Users/jonas/PycharmProjects
/untitled2/Test/Simulation.py", 
line 25, in <module> sol = minimize(Function.Gompertz, x0, method ='SlSQP',bounds = bnds, constraints 
= cons) File "/Library/Frameworks/Python.framework/Versions/3.5/lib
/python3.5/site-packages/scipy/optimize/_minimize.py", 

line 458, in minimize constraints, callback=callback, **options) File "/Library
/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/scipy
/optimize/slsqp.py", 
line 307, in _minimize_slsqp x = asfarray(x0).flatten() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/numpy/lib/type_check.py", 
line 105, in asfarray return asarray(a, dtype=dtype) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/numpy/core/numeric.py", 
line 482, in asarray return array(a, dtype, copy=False, order=order) ValueError: setting an array element with a sequence.```

1 个答案:

答案 0 :(得分:0)

您得到的错误 ValueError: setting an array element with a sequence.  说数组元素不能包含列表。

要给minimize()常量值,应将原始函数的参数拆分为(n,) ndarray x和所有其他参数。 因此,向minimize()函数提供附加常量参数的正确代码将是:

def Gompertz(x, consts):

    x1 = x[1]
    x2 = x[2]
    LF = 0

    for j in range (100):
        DEATH = consts[j]
        T = len(consts)
        for tau in range(T): """the length of the list gives the range of the loop"""
                lf_i = x1 * exp(x2 * tau - x1/x2 * (exp(x2 * tau)-1))
                a = DEATH[tau]
                LF += lf_i ** a   """the values from the list are used here as a power of the valute lf_i """
return -LF 
deathlist = Function.Simulation()
x0 = [1,1]

sol = minimize(Function.Gompertz, x0, args=(deathlist,) method ='SlSQP',bounds = bnds, constraints = cons)
print (sol)