我正在尝试将多项式拟合到我的数据,例如
import scipy as sp
x = [1,6,9,17,23,28]
y = [6.1, 7.52324, 5.71, 5.86105, 6.3, 5.2]
并且说我知道多项式的次数(例如:3),那么我只需使用 scipy.polyfit 方法来获取给定次数的多项式:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
fittedModelFunction = sp.polyfit(x, y, 3)
func = sp.poly1d(fittedModelFunction)
++++++++++++++++++++++++++++++++++ 问题:++++++++++++++++++++++++++++++++
1) 另外,我如何判断结果函数 func 必须始终为正(即对于任何 x,f(x) >= 0)?
2)如何进一步定义约束(例如(局部)最小和最大点的数量等)以获得更好的拟合?
有没有这样的: http://mail.scipy.org/pipermail/scipy-user/2007-July/013138.html 但更准确?
最佳答案
永远积极
我还没有找到一个 scipy 引用来确定一个函数是否是正定的,但间接的方法是找到所有的根 - Scipy Roots - 函数并检查这些根附近的极限。有几种情况需要考虑:
根本没有根
选择任意 x 并计算该函数。由于该函数由于缺少根而不会与 x 轴相交,因此任何正结果都将表明该函数是正的!
有限根数
这可能是最有可能的情况。您必须检查每个根之前和之后的限制 - Scipy Limits 。但是,您必须指定自己的最小可接受增量作为限制。我还没有看到 Scipy 提供的 2 边限制方法,但它看起来很简单,您可以自己制作。
from sympy import limit
// f: function, v: variable to limit, p: point, d: delta
// returns two limit values
def twoSidedLimit(f, v, p, d):
return limit(f, v, p-d), limit(f, v, p+d)
无限根
我不认为 polyfit 会产生振荡函数,但这是需要考虑的事情。我不知道如何用我已经提供的方法来处理这个问题...嗯,希望它不会发生?
约束
唯一内置的约束形式似乎仅限于 optimize library SciPy 的。强制执行 polyfit 约束的一种粗略方法是从 polyfit 获取函数,生成各种 x 的值向量,并尝试从向量中选择违反约束的值。如果您尝试使用 filter
、map
或 lambda
,则对于大向量,它可能会很慢,因为 python 的 filter
使得被过滤的列表/向量的副本。在这方面我实在帮不上什么忙。
关于python - Polyfit 精炼 : setting polynomial to be always possitive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388484/