Python polyfit细化:将多项式设置为始终为正

Python polyfit细化:将多项式设置为始终为正,python,machine-learning,scipy,constraints,data-fitting,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 = s

我正试图用多项式拟合我的数据,例如

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) 
++++++++++++++++++++++++++++++ 问题:++++++++++++++++++++++++++++++

fittedModelFunction = sp.polyfit(x, y, 3)

func = sp.poly1d(fittedModelFunction) 
1) 此外,我如何判断结果函数func必须始终为正(即对于任何x,f(x)>=0)

2) 如何进一步定义约束(例如,(局部)最小点和最大点的数量等),以获得更好的拟合

有这样的smth吗: 但更准确吗?

总是积极的 我还没有找到一个确定函数是否正定的scipy引用,但间接的方法是找到函数的所有根,并检查这些根附近的极限。有几个案例需要考虑:

根本没有根 选择任意x并计算函数。由于缺少根,函数不会穿过x轴,因此任何正结果都将表明函数为正

有限根数 这可能是最有可能的情况。您必须在每个根之前和之后检查限制。但是,您必须为限制指定自己的最小可接受增量。我还没有看到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)
无限根 我不认为聚合体会产生一个振荡函数,但这是一个值得考虑的问题。我不知道如何用我已经提供的方法来处理这个问题。。。希望不会发生

约束条件
唯一的内置形式的约束似乎仅限于SciPy。为polyfit强制执行约束的一种粗略方法是从polyfit获取函数,为各种x生成一个值向量,并尝试从向量中选择违反约束的值。如果尝试使用
过滤器
映射
lambda
,则使用大向量可能会比较慢,因为python的
过滤器
会复制要过滤的列表/向量。在这方面我实在帮不上什么忙。

您想只对预定义的限制域x或整个实线施加非负性吗?主要是对entire实线,但限制域也很有趣(比如任何负x、任何正x或任何偶数x等),谢谢您的回复!但我所面临的问题,并不是要确定或分析积极或消极的最终功能。问题是为polyfit提供附加信息,以便它更好地拟合曲线。