python - Polyfit 精炼 : setting polynomial to be always possitive

标签 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)如何进一步定义约束(例如(局部)最小和最大点的数量等)以获得更好的拟合?

有没有这样的: http://mail.scipy.org/pipermail/scipy-user/2007-July/013138.html 但更准确?

最佳答案

永远积极

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

约束

唯一内置的约束形式似乎仅限于 optimize library SciPy 的。强制执行 polyfit 约束的一种粗略方法是从 polyfit 获取函数,生成各种 x 的值向量,并尝试从向量中选择违反约束的值。如果您尝试使用 filtermaplambda,则对于大向量,它可能会很慢,因为 python 的 filter 使得被过滤的列表/向量的副本。在这方面我实在帮不上什么忙。

关于python - Polyfit 精炼 : setting polynomial to be always possitive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21388484/

相关文章:

python - matplotlib 如何在不在 jupyter 笔记本中时显示绘图

python - 根据一天中的时间选择 DataFrame 中的行?

python - 文本分类性能

python - 如何以正确的方式缩放和预测单个样本

python - 用于校正轻微时钟漂移的插值算法

python if语句返回值错误

python - 字符串列表或单个字符串中的命名元组之间的区别?

python-3.x - 不同特征的不同内核 - scikit-learn SVM

python - 在python中查找具有稀疏矩阵特定特征值的特征向量

python - 跨图像采样向量