最小化器背后的直觉
Posted
技术标签:
【中文标题】最小化器背后的直觉【英文标题】:Intuition behind a minimizer 【发布时间】:2018-08-14 00:44:27 【问题描述】:我是定量和科学编程的新手,我遇到了 scipy scipy.optimize.fmin
的最小化函数。有人可以为非工科学生解释一下这个函数的基本直觉吗?
假设我想最小化以下功能:
def f(x): x**2
1) 最小化器实际上最小化了什么?因变量还是自变量?
2) scipy.optimize.fmin
和 scipy.optimize.minimize
有什么区别?
【问题讨论】:
【参考方案1】:给定一个包含一些未知参数(所以实际上它是一个函数族)和数据的函数,最小化器试图找到最小化函数值与数据之间距离的参数。通俗地说,这是通过迭代调整参数来完成的,直到进一步的变化似乎不会改善结果。
这相当于@pylang 在评论中提到的从山上跑下来的球。给定所有可能的参数值,“山”是到数据的距离。滚动球是在该景观上“移动”的最小化器,尝试参数直到它处于每次移动都会导致与数据的距离增加或至少没有显着减少的位置。
但是请注意,在给定函数的一组参数的情况下,通过这种方法,您正在搜索数据的函数值的局部最小值。对于像您发布的简单函数,局部最小值是唯一的,因此是全局最小值,但是对于涉及许多参数的复杂函数,这个问题很快就会变得非常棘手。
然后人们经常使用多次运行最小化器来查看它是否停在相同的位置。如果不是这样,人们会说最小化器收敛失败,这意味着函数太复杂以至于很容易找到一个最小值。有很多算法可以解决这个问题,我想到了模拟退火或蒙特卡洛方法。
到你的函数: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
。如果您多次运行最小化器以查看它是否收敛,这些是您随机选择的值。
【讨论】:
如果我错了,请纠正我。所以 fmin 函数返回 a 和 b 的值,这导致 sum((f(x,a,b) - y)**2 for x,y in zip(datax, datay)) 的最小值?跨度> 是的。所以连接到你的问题,(a,b)
是你的 x
和 dist
是你的 f
谢谢!但是用于估计的数字范围是多少?我可以将这些数字限制为例如正数吗?
首先,数字的范围是由x0
间接决定的。最小化器将从那里开始并根据距离函数选择导致“下坡”的数字。如果您的参数超出范围,您可以尝试通过返回numpy.nan
或某个高值来禁止某些数字。但是,请记住,最小化器应该始终位于“山坡”上,因为它需要“知道”它必须朝哪个方向去“下坡”。因此,越多的参数超出范围的惩罚值可能会更好,因为它不会“将最小化器放在平面上”【参考方案2】:
-
想象一个球从山上滚下来。这是一个优化问题。 “最小化器”的想法是找到减小梯度/斜率或导数的值。换言之,您正在寻找球最终停留的位置。优化问题会变得更加有趣和复杂,尤其是当球滚入 鞍点 或 局部最小值(不是 全局最小值)或沿着水平 ridge 或 plane,几乎不可能找到最小值。例如,考虑著名的Rosenbrock function(见图),这是一个 2D 表面,找到山谷很简单,但很难找到最小值。
fmin
和minimize
函数几乎等同于simplex algorithm。但是,fmin
对于复杂函数的鲁棒性较差。 minimize
泛化为其他算法,例如"Nelder-Mead" (simplex)、“Powell”、“CG”等。这些算法只是“推挤”或帮助球更快下山的不同方法。此外,将Jacobian 和Hessian matrix 作为参数提供给minimum
函数可以提高计算效率。有关如何使用这些功能的更多信息,请参阅Scipy docs。
【讨论】:
以上是关于最小化器背后的直觉的主要内容,如果未能解决你的问题,请参考以下文章