最小化器背后的直觉
Intuition behind a minimizer
我是定量和科学编程方面的新手,我已经 运行 了解 scipy scipy.optimize.fmin
的最小化函数。有人可以为非工程专业的学生解释一下这个功能的基本直觉吗?
假设我想最小化以下函数:
def f(x): x**2
1) 最小化器实际上最小化了什么?因变量还是自变量?
2) scipy.optimize.fmin
和 scipy.optimize.minimize
有什么区别?
- 想象一个球从山上滚下来。这是一个优化问题。 "minimizer" 的想法是找到减少 gradient/slope 或导数的值。换句话说,你正在寻找球最终落在哪里。优化问题会变得更加有趣和复杂,特别是如果球滚入 鞍点 或 局部最小值(不是 全局最小值) 或沿 ridge 或 plane 的水平,几乎不可能找到最小值。例如,考虑一下著名的 Rosenbrock function(见图),这是一个二维表面,其中找到山谷很简单,但很难找到最小值。
fmin
和 minimize
函数几乎等同于 simplex algorithm. However, fmin
is less robust for complex functions. minimize
is generalized for other algorithms, e.g. "Nelder-Mead" (simplex), "Powell", "CG", etc. These algorithms are just different approaches for "jostling" or helping the ball down the hill faster towards the minimum. Moreover, supplying a Jacobian and Hessian matrix as parameters to the minimum
function improves computation efficiency. See the Scipy docs 以了解有关如何使用这些函数的更多信息。
给定一个包含一些未知参数(因此实际上它是一个函数族)和数据的函数,最小化器试图找到使函数值与数据的距离最小化的参数。通俗地说,这是通过迭代调整参数,直到进一步的改变似乎无法改善结果为止。
这相当于球 运行滚下山坡,@pylang 在评论中提到。给定所有可能的参数值,"hill" 是到数据的距离。滚动球是在该景观上 "moves" 的最小化器,它会尝试参数,直到它处于每次移动都会导致与数据的距离增加或至少不会显着减少的位置。
但是请注意,通过此方法,您可以在给定一组函数参数的情况下搜索数据的函数值的局部最小值。对于像您发布的简单函数,局部最小值是唯一的,因此是全局最小值,但是对于涉及许多参数的复杂函数,这个问题很快就会变得非常棘手。
然后人们经常使用多个 运行s 的最小化器来查看它是否停在相同的位置。如果不是这种情况,人们会说 mimimizer 无法收敛 ,这意味着函数太复杂以至于很容易找到一个最小值。有很多算法可以解决这个问题,我想到了模拟退火或 Monte Carlo 方法。
你的函数:help of the fmin function中例子中提到的函数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]
那么如果你使用欧几里德范数,你的距离函数就是(这是fmin
帮助中的函数f
)
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))
请注意,您的参数 a
和 b
需要起始值 x0
。如果您多次 运行 最小化器以查看它是否收敛,这些是您随机选择的值。
我是定量和科学编程方面的新手,我已经 运行 了解 scipy scipy.optimize.fmin
的最小化函数。有人可以为非工程专业的学生解释一下这个功能的基本直觉吗?
假设我想最小化以下函数:
def f(x): x**2
1) 最小化器实际上最小化了什么?因变量还是自变量?
2) scipy.optimize.fmin
和 scipy.optimize.minimize
有什么区别?
- 想象一个球从山上滚下来。这是一个优化问题。 "minimizer" 的想法是找到减少 gradient/slope 或导数的值。换句话说,你正在寻找球最终落在哪里。优化问题会变得更加有趣和复杂,特别是如果球滚入 鞍点 或 局部最小值(不是 全局最小值) 或沿 ridge 或 plane 的水平,几乎不可能找到最小值。例如,考虑一下著名的 Rosenbrock function(见图),这是一个二维表面,其中找到山谷很简单,但很难找到最小值。
fmin
和minimize
函数几乎等同于 simplex algorithm. However,fmin
is less robust for complex functions.minimize
is generalized for other algorithms, e.g. "Nelder-Mead" (simplex), "Powell", "CG", etc. These algorithms are just different approaches for "jostling" or helping the ball down the hill faster towards the minimum. Moreover, supplying a Jacobian and Hessian matrix as parameters to theminimum
function improves computation efficiency. See the Scipy docs 以了解有关如何使用这些函数的更多信息。
给定一个包含一些未知参数(因此实际上它是一个函数族)和数据的函数,最小化器试图找到使函数值与数据的距离最小化的参数。通俗地说,这是通过迭代调整参数,直到进一步的改变似乎无法改善结果为止。
这相当于球 运行滚下山坡,@pylang 在评论中提到。给定所有可能的参数值,"hill" 是到数据的距离。滚动球是在该景观上 "moves" 的最小化器,它会尝试参数,直到它处于每次移动都会导致与数据的距离增加或至少不会显着减少的位置。
但是请注意,通过此方法,您可以在给定一组函数参数的情况下搜索数据的函数值的局部最小值。对于像您发布的简单函数,局部最小值是唯一的,因此是全局最小值,但是对于涉及许多参数的复杂函数,这个问题很快就会变得非常棘手。
然后人们经常使用多个 运行s 的最小化器来查看它是否停在相同的位置。如果不是这种情况,人们会说 mimimizer 无法收敛 ,这意味着函数太复杂以至于很容易找到一个最小值。有很多算法可以解决这个问题,我想到了模拟退火或 Monte Carlo 方法。
你的函数:help of the fmin function中例子中提到的函数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]
那么如果你使用欧几里德范数,你的距离函数就是(这是fmin
帮助中的函数f
)
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))
请注意,您的参数 a
和 b
需要起始值 x0
。如果您多次 运行 最小化器以查看它是否收敛,这些是您随机选择的值。