最小化背后的直觉

时间:2018-03-06 08:09:52

标签: python math optimization scipy beta-distribution

我在定量和科学编程方面非常新,我遇到了scipy scipy.optimize.fmin的最小化函数。有人能解释一下非工科学生对这个功能的基本直觉吗?

Letz说我想尽量减少以下功能:

def f(x): x**2

1)最小化器实际上最小化了什么?依赖变量或自变量?

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

2 个答案:

答案 0 :(得分:4)

  1. 想象一下球从山上滚下来。这是一个优化问题。 “最小化器”的想法是找到降低梯度/斜率或导数的值。换句话说,你找到球最终在哪里。优化问题会变得更加有趣和复杂,特别是如果球滚入鞍点局部最小值(不是全局最小值)或沿着等级 ridge plane ,其中最低限度几乎无法找到。例如,考虑一下着名的Rosenbrock function(参见图片),一个2D表面,找到山谷很简单,但找到最小值是困难的。
  2. enter image description here

    1. fminminimize函数几乎等同于simplex algorithm。但是,对于复杂的函数, fmin不太健壮。 minimize适用于其他算法,例如: "Nelder-Mead" (simplex),“Powell”,“CG”等。这些算法只是用于“推撞”或帮助球更快地向下滑动的不同方法。此外,向minimum函数提供JacobianHessian matrix作为参数可提高计算效率。有关如何使用这些功能的更多信息,请参阅Scipy docs

答案 1 :(得分:4)

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

这相当于在小山上奔跑的球,@pylang在评论中提到。 "山"给定所有可能的参数值,是数据的距离。滚球是最小化器,它可以移动"在这种情况下,尝试参数,直到它处于每次移动都会导致数据距离增加或至少没有明显减少的位置。

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

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

对于您的功能:help of the fmin function中示例中提到的函数f距离函数。它告诉您某个参数集对您的目标有多远。现在您必须定义适合您的距离。通常,使用残差平方和(也称为欧几里德范数):

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

假设你有一个功能

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

您希望找到ab的值,以便您的功能尽可能接近下面给出的数据点及其各自的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))

请注意,您需要为参数x0a提供值b。如果您多次运行最小化器以查看它是否收敛,则这些是您随机选择的值。