我在定量和科学编程方面非常新,我遇到了scipy scipy.optimize.fmin
的最小化函数。有人能解释一下非工科学生对这个功能的基本直觉吗?
Letz说我想尽量减少以下功能:
def f(x): x**2
1)最小化器实际上最小化了什么?依赖变量或自变量?
2)scipy.optimize.fmin
和scipy.optimize.minimize
之间有什么区别?
答案 0 :(得分:4)
fmin
和minimize
函数几乎等同于simplex algorithm。但是,对于复杂的函数, fmin
不太健壮。 minimize
适用于其他算法,例如: "Nelder-Mead" (simplex),“Powell”,“CG”等。这些算法只是用于“推撞”或帮助球更快地向下滑动的不同方法。此外,向minimum
函数提供Jacobian和Hessian 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
您希望找到a
和b
的值,以便您的功能尽可能接近下面给出的数据点及其各自的x
和y
值:
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,今晚会测试它)以最小化以获得a
和b
的拟合值
import scipy.optimize
res = scipy.optimize.fmin(dist, x0 = (0,0))
请注意,您需要为参数x0
和a
提供值b
。如果您多次运行最小化器以查看它是否收敛,则这些是您随机选择的值。