>假设我有一个假设函数,我想近似:
def f(x):
return a * x ** 2 + b * x + c
a
、b
和c
是我不知道的值。
我在某些点上知道函数输出,即
x = [-1, 2, 5, 100]
y = [123, 456, 789, 1255]
(实际上还有更多的值)
我想得到a
、b
和c
,同时最小化平方误差(此外还要得到平方误差)。
在Python中做到这一点的方法是什么?
scipy
、numpy
或类似的地方都应该有现有的解决方案。
由于您尝试拟合的函数是多项式,因此您可以使用numpy.polyfit
>>> numpy.polyfit(x, y, 2) # The 2 signifies a polynomial of degree 2
array([ -1.04978546, 115.16698544, 236.16191491])
这意味着最佳拟合为 y ~ -1.05 x2 + 115.157x + 236.16。
对于一般函数,您对它的了解越多(例如,它是凸的、可微的、两次可微的等),你就越能用scipy.optimize.minimize
做得更好。 例如,如果你对它几乎一无所知,你可以使用它来指定使用Nelder-Mead方法。那里的其他方法(请参阅文档)可以使用雅可比和黑森,如果它们已定义,您可以计算它们。
就个人而言,我发现将其与Nelder-Mead一起使用(几乎不需要任何参数)可以满足我的需求。
例
假设您正在尝试拟合 y = kx,并将 k 作为优化参数。你会写一个函数
x = ...
y = ...
def ss(k):
# use numpy.linalg.norm to find the sum-of-squares error between y and kx
然后,您将在函数上使用scipy.optimize.minimize
ss
.