【问题标题】:get function by its values in certain points通过某些点的值获取函数
【发布时间】:2016-06-05 14:08:49
【问题描述】:

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

def f(x):
    return a * x ** 2 + b * x + c

abc 是我不知道的值。

而且我有一些已知函数输出的点,即

x = [-1, 2, 5, 100]
y = [123, 456, 789, 1255]

(实际上还有更多的价值)

我想获得abc,同时最小化平方误差(同时获得平方误差)。

在 Python 中有什么方法可以做到这一点?

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

【问题讨论】:

标签: python numpy machine-learning scipy scikit-learn


【解决方案1】:

由于您要拟合的函数是多项式,您可以使用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 一起使用(几乎不需要参数)可以满足我的需求。


示例

假设您尝试将 y = kxk 作为要优化的参数。你会写一个函数

x = ...
y = ...

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

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

【讨论】:

  • 是的,通常它是凸的和可微的。
  • 谢谢!一般来说,我没有比我提到的更复杂的东西。我知道你提到了 polyfit,但是如果我有一个函数,它正好是 y=kx,即我知道没有第二个参数,它出现在 y=kx+b 中? polyfit 假设在 n 次多项式中始终存在 n + 1 个特征。
  • @omtcyf0 查看更多更新,以您的最后一个为例。
  • 啊哈,好的,我明白了,谢谢!所以我是否正确地假设如果我确切地知道函数的样子(例如,没有 k 度的条目等等)Nelder-Mead 和最小化是我正在寻找的?我的任务是计算现有物理公式中的参数,所以我确切地知道它的样子。
  • 嗯,Nelder-Mead + minimize 是我个人使用的。但说实话,如果您愿意花时间计算所有偏导数和其他东西,您可以使用其中一种更快收敛的选项。我从来没有这样做过(我的凸优化教授一定在他的坟墓里翻滚)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多