最小化器背后的直觉

Kra*_*ars 2 python math optimization scipy beta-distribution

我在定量和科学编程方面非常陌生,并且遇到了 scipy 的最小化函数scipy.optimize.fmin。有人可以为非工程专业的学生解释这个函数的基本直觉吗?

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

def f(x): x**2
Run Code Online (Sandbox Code Playgroud)

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

2)什么之间的区别scipy.optimize.fminscipy.optimize.minimize

akr*_*ica 5

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

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

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

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

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

sum((function values - data points)^2)
Run Code Online (Sandbox Code Playgroud)

说你有一个功能

def f(x, a, b): return a*x**2 + b
Run Code Online (Sandbox Code Playgroud)

你想找到值a,并b使得你的功能尽可能地涉及到下面各自给出的数据点xy值:

datax = [ 0, 1, 2, 3, 4]
datay = [ 2, 3, 5, 9, 15]
Run Code Online (Sandbox Code Playgroud)

然后,如果你使用的欧几里得范,你的距离函数(这是函数ffmin帮助)

def dist(params):
    a, b = params
    return sum((f(x,a,b) - y)**2 for x,y in zip(datax, datay))
Run Code Online (Sandbox Code Playgroud)

您应该能够(抱歉,我当前的机器上没有 scipy,今晚将对其进行测试)最小化以获得 的拟合值ab使用

 import scipy.optimize
 res = scipy.optimize.fmin(dist, x0 = (0,0))
Run Code Online (Sandbox Code Playgroud)

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