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提供附加信息,以便它更好地拟合曲线。