Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过优化单个参数最小化模型和观测之间的差异_Python_Optimization_Scipy - Fatal编程技术网

Python 通过优化单个参数最小化模型和观测之间的差异

Python 通过优化单个参数最小化模型和观测之间的差异,python,optimization,scipy,Python,Optimization,Scipy,我承认我不确定这个问题是否更适合StackOverflow或其他地方,因为我不确定这是编程还是我需要理解的整个概念。如果偏离主题,我道歉 在Python中,我创建了一个相当简单的模型。它是一个函数,它接受一个数组x,几个系数c1,c2等等,以及一个我想要优化的参数P。 我希望通过更改参数P来最小化测量值和建模值之间的差异,并且作为输出,我希望得到结果参数(标量)以及模型和测量值(数组)之间的结果差异 我已经研究了scipy.optimize.minimize一段时间了,但我似乎没有理解它。特别是

我承认我不确定这个问题是否更适合StackOverflow或其他地方,因为我不确定这是编程还是我需要理解的整个概念。如果偏离主题,我道歉

在Python中,我创建了一个相当简单的模型。它是一个函数,它接受一个数组
x
,几个系数
c1
c2
等等,以及一个我想要优化的参数
P
。 我希望通过更改参数
P
来最小化测量值和建模值之间的差异,并且作为输出,我希望得到结果参数(标量)以及模型和测量值(数组)之间的结果差异

我已经研究了
scipy.optimize.minimize
一段时间了,但我似乎没有理解它。特别是,我不明白:

  • 如何定义进入最小化的标量函数,以便只修改P
  • 在这种情况下,哪种最小化方法是最好的(我假设了最小二乘法,但查看文档中有很多其他方法,我甚至不知道如果推荐另一种方法,我会接受该选项,只要建议中附带解释)
  • 如何获得所需的输出(因为优化结果似乎是一个整体上的python对象,但我只需要上面所述的非常具体的输出)
  • 例如:

    import numpy as np
    
    array1 = np.random.rand(10)
    array2 = np.arange(5.,55,5)
    
    from scipy.optimize import minimize
    
    def model(c1, c2, c3, x, P):
        modelY = x*c1 + c2*x*P + c3 # some random function for which I need to optimize P
        return modelY
    
    现在,如果我想要的最小值是
    np.abs(measured-modelY)
    ,并且我想要更改的唯一参数是
    p
    ,它是
    model
    函数的一个参数,并使用测量数据作为初始猜测,那么我将使用
    scipy.optimize.minimize
    使用什么语法?或者我应该把它们放在一个函数中?但是,我如何指定不修改函数的所有其他参数,除了一个?
    我如何从最小化结果中提取差异和由此产生的
    P

    你的问题,imho,从描述和参数名称中遭受了很多痛苦,但我想我现在得到了你想要实现的

    我将它简化了一点,并用两种方法展示了一些代码,一种是好的,另一种是坏的。好的一个:优化一个变量是通过对单个变量使用优化器(
    minimize\u scalar
    )来完成的!坏的一个:使用任何多变量优化器(
    minimize

    人们可能会谈论如何使用scipy的优化器,但我不会这么做。我只想说:跟着文件走!最重要的是(这里是一些文档摘录):

    可调用的被称为方法(fun、x0、args、**kwargs、**options),其中kwargs对应于传递给minimize的任何其他参数(如callback、hess等),但options dict除外,其内容也作为方法参数成对传递。此外,如果jac已作为bool类型传递,则jac和fun将被破坏,以便fun仅返回函数值,而jac将转换为返回雅可比矩阵的函数。该方法应返回一个OptimizeResult对象

    这意味着:p是您给scipy优化器的函数中的第一个参数(在这两种情况下)。除此之外,您可以通过python的作用域规则(函数可用的变量)或使用
    args
    来使用

    代码:

    输出:

    minimize_scalar result:  60.1334526945
    minimize result:  [ 60.1334535]
    
    编辑:刚刚认识到,我的var名称也不好
    f_x
    不是对某个函数的某种评估,应该只调用
    x
    ,但要小心:
    x
    通常是要优化的参数

    备注:并始终检查结果

    例如


    这就是我建议最小化_标量的原因,它使用了更多的假设,因此更健壮(需要的调优更少)

    您的问题,imho,由于描述和参数名称而遭受了很多痛苦,但我想我现在得到了您想要实现的目标

    我将它简化了一点,并用两种方法展示了一些代码,一种是好的,另一种是坏的。好的一个:优化一个变量是通过对单个变量使用优化器(
    minimize\u scalar
    )来完成的!坏的一个:使用任何多变量优化器(
    minimize

    人们可能会谈论如何使用scipy的优化器,但我不会这么做。我只想说:跟着文件走!最重要的是(这里是一些文档摘录):

    可调用的被称为方法(fun、x0、args、**kwargs、**options),其中kwargs对应于传递给minimize的任何其他参数(如callback、hess等),但options dict除外,其内容也作为方法参数成对传递。此外,如果jac已作为bool类型传递,则jac和fun将被破坏,以便fun仅返回函数值,而jac将转换为返回雅可比矩阵的函数。该方法应返回一个OptimizeResult对象

    这意味着:p是您给scipy优化器的函数中的第一个参数(在这两种情况下)。除此之外,您可以通过python的作用域规则(函数可用的变量)或使用
    args
    来使用

    代码:

    输出:

    minimize_scalar result:  60.1334526945
    minimize result:  [ 60.1334535]
    
    编辑:刚刚认识到,我的var名称也不好
    f_x
    不是对某个函数的某种评估,应该只调用
    x
    ,但要小心:
    x
    通常是要优化的参数

    备注:并始终检查结果

    例如


    这就是我建议最小化_标量的原因,它使用了更多的假设,因此更健壮(需要的调优更少)

    我认为这个问题是关于主题的,因为它是关于编程的(2除外。-使用哪种方法取决于手头的问题,可能不需要程序员回答)。然而,我相信
    result = minimize_scalar(loss, args=(c1, c2, c3, f_x, f_y))
    p_at_minimum = result.x  # i'm a scalar!
    print('minimize_scalar result: ', p_at_minimum)
    print('success: ', result.success)
    # True
    
    result = minimize(loss, np.zeros(1), args=(c1, c2, c3, f_x, f_y))
    p_at_minimum = result.x   # i'm a vector!!!
    print('minimize result: ', p_at_minimum)
    print('success: ', result.success)
    # False (precision-loss -> you can check result.message