2

我是定量和科学编程的新手,我遇到了 scipy 的最小化函数scipy.optimize.fmin。有人可以为非工科学生解释一下这个函数的基本直觉吗?

Letz说我想最小化以下功能:

def f(x): x**2

1)最小化器实际上最小化了什么?因变量还是自变量?

scipy.optimize.fmin2)和有什么区别scipy.optimize.minimize

4

2 回答 2

5

给定一个包含一些未知参数的函数(实际上它是一个函数族)和数据,最小化器试图找到最小化函数值与数据的距离的参数。通俗地说,这是通过迭代调整参数来完成的,直到进一步的变化似乎不会改善结果。

这相当于@pylang 在评论中提到的从山上跑下来的球。给定所有可能的参数值,“山”是到数据的距离。滚动球是在该景观上“移动”的最小化器,尝试参数直到它处于每次移动都会导致与数据的距离增加或至少没有显着减少的位置。

但是请注意,在给定函数的一组参数的情况下,通过这种方法,您正在搜索数据的函数值的局部最小值。对于像您发布的简单函数,局部最小值是唯一的,因此是全局最小值,但是对于涉及许多参数的复杂函数,这个问题很快就会变得非常棘手。

然后人们经常使用最小化器的多次运行来查看它是否停止在相同的位置。如果不是这样,人们会说 mimimizer无法收敛,这意味着函数太复杂以至于很容易找到一个最小值。有很多算法可以解决这个问题,我想到了模拟退火或蒙特卡洛方法。

对您的功能:示例中在 fmin 功能f的帮助下提到的功能是距离功能。它告诉您一组参数相对于您的目标有多远。现在你必须定义距离对你意味着什么。通常,使用残差平方和(也称为欧几里得范数):

sum((function values - data points)^2)

假设你有一个函数

def f(x, a, b): return a*x**2 + b

您希望找到 和 的值,以a使b您的函数尽可能接近下面给出的数据点及其各自的xy

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,今晚将对其进行测试)最小化以获得拟合值ab使用

 import scipy.optimize
 res = scipy.optimize.fmin(dist, x0 = (0,0))

x0请注意,您需要参数的起始值ab. 如果您多次运行最小化器以查看它是否收敛,这些是您随机选择的值。

于 2018-03-06T09:00:49.407 回答
4
  1. 想象一个球滚下山。这是一个优化问题。“最小化器”的想法是找到减小梯度/斜率或导数的值。换句话说,你正在寻找球最终停在哪里。优化问题会变得更加有趣和复杂,特别是如果球滚到鞍点局部最小值(不是全局最小值)或沿着水平山脊平面滚动时,几乎不可能找到最小值。例如,考虑著名的Rosenbrock 函数(参见图片),这是一个 2D 表面,其中找到山谷很简单,但很难找到最小值。

在此处输入图像描述

  1. 和函数几乎等同于fmin单纯形算法。但是,对于复杂的功能,鲁棒性较差。被推广到其他算法,例如“Nelder-Mead”(单纯形)、“Powell”、“CG”等。这些算法只是“推挤”或帮助球更快下山的不同方法。此外,提供雅可比矩阵黑森矩阵作为函数的参数可以提高计算效率。有关如何使用这些函数的更多信息,请参阅Scipy 文档。minimizefminminimizeminimum
于 2018-03-06T08:40:25.540 回答