3

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

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

4

1 回答 1

0

永远积极

我无法找到确定函数是否为正定的 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 会产生振荡函数,但这是需要考虑的事情。我不知道如何用我已经提供的方法来处理这个......嗯,希望它不会发生?

约束

约束的唯一内置形式似乎仅限于 SciPy 的优化库。对 polyfit 实施约束的一种粗略方法是从 polyfit 获取函数,为各种 x 生成一个值向量,并尝试从向量中选择违反约束的值。如果您尝试使用filter, map,或者lambda使用大向量可能会很慢,因为 pythonfilter会复制被过滤的列表/向量。在这方面我真的无能为力。

于 2014-01-28T14:50:35.120 回答