polyfit refining:设置多项式始终为正

时间:2014-01-27 18:15:47

标签: python machine-learning scipy constraints data-fitting

我试图将多项式拟合到我的数据中,例如

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 但更准确?

1 个答案:

答案 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生成值的向量,并尝试从违反约束的向量中选择值。如果您尝试使用filtermaplambda,那么大型向量可能会很慢,因为python的filter会生成要过滤的列表/向量的副本。我无法在这方面提供帮助。