给定一个包含一些未知参数(所以实际上它是一个函数族)和数据的函数,最小化器试图找到最小化函数值与数据之间距离的参数。通俗地说,这是通过迭代调整参数来完成的,直到进一步的变化似乎不会改善结果。
这相当于@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。如果您多次运行最小化器以查看它是否收敛,这些是您随机选择的值。