我试图将多项式拟合到我的数据中,例如
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)如何进一步定义约束(例如(局部)最小和最大点数等)以获得更好的拟合?
有这样的smth: http://mail.scipy.org/pipermail/scipy-user/2007-July/013138.html 但更准确?
答案 0 :(得分:0)
我无法找到确定某个函数是否为正定的scipy引用,但间接的方法是找到函数的所有根 - Scipy Roots - 并检查限制靠近那些根源。有几种情况需要考虑:
选择任何x并评估该功能。由于缺少根,函数不会越过x轴,任何正面结果都表明函数是正的!
这可能是最可能的情况。您必须检查每个根之前和之后的限制 - Scipy Limits。但是,您必须为限制指定自己的最小可接受增量。我没有看到Scipy提供的双面限制方法,但它看起来很简单,可以制作自己的。
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会产生振荡功能,但这是需要考虑的事情。我不知道如何使用我已经提供的方法处理这个...嗯,希望它不会发生?
唯一内置的约束形式似乎仅限于SciPy的optimize library。对polyfit强制执行约束的粗略方法是从polyfit获取函数,为各种x生成值的向量,并尝试从违反约束的向量中选择值。如果您尝试使用filter
,map
或lambda
,那么大型向量可能会很慢,因为python的filter
会生成要过滤的列表/向量的副本。我无法在这方面提供帮助。