通过某些点的值获取函数

kir*_*rev 4 python numpy machine-learning scipy scikit-learn

假设我有一个我想近似的假设函数:

def f(x):
    return a * x ** 2 + b * x + c
Run Code Online (Sandbox Code Playgroud)

在哪里ab以及c我不知道的值。

而且我知道函数输出的某些点,即

x = [-1, 2, 5, 100]
y = [123, 456, 789, 1255]
Run Code Online (Sandbox Code Playgroud)

(实际上还有更多的值)

我想得到a,bc同时最小化平方误差(并另外得到平方误差)。

在 Python 中这样做的方法是什么?

应该有现有的解决方案scipynumpy或者任何类似的地方。

Ami*_*ory 5

由于您尝试拟合的函数是多项式,因此您可以使用 numpy.polyfit

>>> numpy.polyfit(x, y, 2) # The 2 signifies a polynomial of degree 2
array([  -1.04978546,  115.16698544,  236.16191491])
Run Code Online (Sandbox Code Playgroud)

这意味着最佳拟合是y ~ -1.05 x 2 + 115.157x + 236.16

对于一般函数,您对它了解得越多(例如,它是凸的、可微的、二次可微的等),您就可以更好地使用scipy.optimize.minimize。例如,如果您对它几乎一无所知,您可以使用它指定使用 Nelder-Mead 方法。那里的其他方法(请参阅文档)可以使用 Jacobian 和 Hessian(如果已定义),并且您可以计算它们。

就我个人而言,我发现将它与 Nelder-Mead(几乎不需要参数)一起使用可以为我提供足够的结果来满足我的需要。


例子

假设你正在试图将Y = KXķ作为参数进行优化。你会写一个函数

x = ...
y = ...

def ss(k):
    # use numpy.linalg.norm to find the sum-of-squares error between y and kx
Run Code Online (Sandbox Code Playgroud)

然后你会scipy.optimize.minimize在函数上使用ss