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