Python 使用多个数据集优化数值模型(scipy.minimize/scipy.optimize、pymoo或??)

Python 使用多个数据集优化数值模型(scipy.minimize/scipy.optimize、pymoo或??),python,numpy,optimization,scipy,data-fitting,Python,Numpy,Optimization,Scipy,Data Fitting,所以我有个问题,我现在有点迷路了。因此,如果您有任何意见,我将不胜感激,因为我现在真的很挣扎^ ^ 我有一个模型,我想用我得到的一些实验数据进行检查/优化 一般来说,我的模型有两个输入(比如时间和温度),有8个变量(x0-x7)。该模型生成两个输出(out1和out2) 每组实验数据为我提供了4组优化信息:2个输入(时间和温度)和2个实验结果(结果1和结果2) 最后,我想最小化result1&out1和result2&out2之间的差异。因此,基本上是用受8个参数影响的多组数据最小化两个残差,它

所以我有个问题,我现在有点迷路了。因此,如果您有任何意见,我将不胜感激,因为我现在真的很挣扎^ ^

我有一个模型,我想用我得到的一些实验数据进行检查/优化

一般来说,我的模型有两个输入(比如时间和温度),有8个变量(x0-x7)。该模型生成两个输出(out1和out2)

每组实验数据为我提供了4组优化信息:2个输入(时间和温度)和2个实验结果(结果1和结果2)

最后,我想最小化result1&out1和result2&out2之间的差异。因此,基本上是用受8个参数影响的多组数据最小化两个残差,它们都有共同点(x0-x7)

我对参数x0-x7有一些限制,这可能会有所帮助,但除此之外,没有真正的限制

到目前为止,我已经尝试使用scipy.minimize,并对我的实验结果数据集进行了迭代,如下所示(非常示意):

这显然不起作用,因为我只是重复了不同的案例。对Stackoverflow的搜索产生了一些结果,但是它们似乎都优化了给定的函数,而我没有

第一个问题是:你会推荐什么样的优化?这离有用的东西很近吗

第二个问题:如何在优化过程中获得多个要考虑的实验数据集?我获取输入的方法似乎相当粗糙。我还尝试创建两个列表,其中的数据已经实现为数组元素,但也没用

最后:任何对优化有一点了解的人都可以看到,我在这一领域相当生疏——所以我很抱歉,但如果有人能为我指出正确的方向或提供帮助,我将不胜感激

我已经找到的资料来源: -
-共享对象函数的基本思想很好。我并没有真正深入到行动尝试的细节,因为这可能会产生误导。该过程将定义一个适当的残差函数,该函数可用于最小二乘拟合。Python中有几种可能实现这一点。我将显示
scipy.optimize.leastsq
和密切相关的
scipy.optimize.least\u squares

将numpy导入为np
从scipy.optimize import least_squares###中,允许有界,并给出了损失函数,但仅提供雅可比矩阵
从scipy.optimize import leastsq##提供缩放协方差矩阵
"""
一些任意的测试函数接受两个输入并提供
两个具有共享参数的相关输出-只有三个用于测试。
"""
def测试_功能(时间、温度、x0、x1、x2):
s=np.sqrt(时间/x0)*np.log(温度-x1)/x2)
t=np.exp(-time/x0)*np.sqrt((time/x0)**2+((temp-x1)/x2)**2)
返回s,t
###用噪音制造一些数据
indata=list()
对于范围(60)内的:
a=50*np.random.random()
b=10+25*np.random.random()
indata.append([a,b])
outdata=list()
对于indata中的a、b:
s、 t=测试功能(a、b、3.78、5.33、12.88)
噪声1=np.随机.正常(标度=0.01)
噪声2=np.随机.正常(标度=0.01)
outdata.append([s+noise1,t+noise2])
indata=np.数组(indata)
outdata=np.array(outdata)
#########################################################################
###定义拟合的剩余函数这是重要的一部分!
#########################################################################
def残差(参数、扩展数据、ydata、权重A=1、权重B=1):
x0,x1,x2=参数
diff=list()
对于ab,邮政编码中的st(indata,outdata):
a、 b=ab
s、 t=st
sf,tf=测试函数(a,b,x0,x1,x2)
差异附加(权重A*(s-sf))
差异附加(权重b*(t-tf))
回差
###合身
solx、cov、info、msg、ier=leastsq(
残差[3.8,5.0,12.5],
args=(indata,outdata),完整输出=真
)
打印溶胶
打印cov
sol=最小二乘法(残差[3.8,5.0,12.5],args=(indata,outdata))
打印sol.x

根据OP的需要修改它应该很容易。

非常感谢!:)
import numpy as np
from scipy.optimize import minimize

Experiment=[['Set 1','Set 2',
             'Set 3','Set 4'],
                   [Out 1-1,Out 1-2,
                    Out 1-3,Out 1-4],
                   [Out 2-1,Out 2-2,
                    Out 2-3,Out 2-4],
            ]
global curr_case
curr_case=0 #just for debugging in the first place

def objective_fcn(x):
    
    SetFitParameters(x) #x0-x7
    
    #---------probably totally dumb: iteration-----------
    global curr_case    #number of experimental set
        curr_case=curr_case+1
    if curr_case==len(Experiment):
        curr_case=0
    #----------------------------------------------------
    
    getTemp(curr_case) # function that gets time and temperature from experimental data as two arrays - time and temperature
    
    RefVariables(x) #sets some global variabales needed for ModelCal using x0-x7
    
    ModelCal(time,Temperature)  #gives Out1 and Out2
    
    f1 = abs(Out1[Upper_index-1]-Experiment[1][curr_case]) #compares Out1 with result1 (from experimental data)
    f2 = abs(Out2[Upper_index-1]-Experiment[2][curr_case]) #compares Out2 with result2 (from experimental data)
    
    # some weighting factors for the future - maybe?
    A=1
    B=1
    
    return A*f1+B*f2
   
bounds_x1=(1450,1700) #upper and lower bonds of x0
bounds_x2=(0.1,1)
bounds_x3=(1450,1700)
bounds_x4=(0.1,7)
bounds_x5=(1450,1700)
bounds_x6=(0.1,7)
bounds_x7=(1450,1700)
bounds_x8=(0.1,7)

bounds=[bounds_x1,bounds_x2,bounds_x3,bounds_x4,bounds_x5,bounds_x6,bounds_x7,bounds_x8]

x0=[1663,0.156,1523,6.37,1663,4.38,1523,2.2] #some initial guesses

result=minimize(objective_fcn, x0,bounds=bounds)