我是定量和科学编程的新手,我遇到了 scipy 的最小化函数scipy.optimize.fmin
。有人可以为非工科学生解释一下这个函数的基本直觉吗?
Letz说我想最小化以下功能:
def f(x): x**2
1)最小化器实际上最小化了什么?因变量还是自变量?
scipy.optimize.fmin
2)和有什么区别scipy.optimize.minimize
?
我是定量和科学编程的新手,我遇到了 scipy 的最小化函数scipy.optimize.fmin
。有人可以为非工科学生解释一下这个函数的基本直觉吗?
Letz说我想最小化以下功能:
def f(x): x**2
1)最小化器实际上最小化了什么?因变量还是自变量?
scipy.optimize.fmin
2)和有什么区别scipy.optimize.minimize
?
给定一个包含一些未知参数的函数(实际上它是一个函数族)和数据,最小化器试图找到最小化函数值与数据的距离的参数。通俗地说,这是通过迭代调整参数来完成的,直到进一步的变化似乎不会改善结果。
这相当于@pylang 在评论中提到的从山上跑下来的球。给定所有可能的参数值,“山”是到数据的距离。滚动球是在该景观上“移动”的最小化器,尝试参数直到它处于每次移动都会导致与数据的距离增加或至少没有显着减少的位置。
但是请注意,在给定函数的一组参数的情况下,通过这种方法,您正在搜索数据的函数值的局部最小值。对于像您发布的简单函数,局部最小值是唯一的,因此是全局最小值,但是对于涉及许多参数的复杂函数,这个问题很快就会变得非常棘手。
然后人们经常使用最小化器的多次运行来查看它是否停止在相同的位置。如果不是这样,人们会说 mimimizer无法收敛,这意味着函数太复杂以至于很容易找到一个最小值。有很多算法可以解决这个问题,我想到了模拟退火或蒙特卡洛方法。
对您的功能:示例中在 fmin 功能f
的帮助下提到的功能是距离功能。它告诉您一组参数相对于您的目标有多远。现在你必须定义距离对你意味着什么。通常,使用残差平方和(也称为欧几里得范数):
sum((function values - data points)^2)
假设你有一个函数
def f(x, a, b): return a*x**2 + b
您希望找到 和 的值,以a
使b
您的函数尽可能接近下面给出的数据点及其各自的x
值y
:
datax = [ 0, 1, 2, 3, 4]
datay = [ 2, 3, 5, 9, 15]
然后如果你使用欧几里得范数,你的距离函数是(这是帮助中的f
函数fmin
)
def dist(params):
a, b = params
return sum((f(x,a,b) - y)**2 for x,y in zip(datax, datay))
您应该能够(对不起,我当前的机器上没有 scipy,今晚将对其进行测试)最小化以获得拟合值a
并b
使用
import scipy.optimize
res = scipy.optimize.fmin(dist, x0 = (0,0))
x0
请注意,您需要参数的起始值a
和b
. 如果您多次运行最小化器以查看它是否收敛,这些是您随机选择的值。