假设我有一个近似函数,我想近似一下:
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方法.如果定义了其他方法(请参阅文档),则可以使用Jacobian和Hessian,并且可以对其进行计算.
就个人而言,我发现将其与Nelder-Mead结合使用(几乎不需要任何参数)可以满足我的需求.
例
假设您要尝试使用k作为要优化的参数来拟合y = kx.你会写一个函数
x = ...
y = ...
def ss(k):
# use numpy.linalg.norm to find the sum-of-squares error between y and kx
然后在函数ss上使用scipy.optimize.minimize.