使用NumPy的polyfit
(或类似的东西)是否有一种简单的方法来获得一个或多个系数被限制为特定值的解决方案?
例如,我们可以使用以下公式找到普通多项式拟合:
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([0.0, 0.8, 0.9, 0.1, -0.8, -1.0])
z = np.polyfit(x, y, 3)
屈服
array([ 0.08703704, -0.81349206, 1.69312169, -0.03968254])
但是,如果我想要最佳拟合多项式,其中第三个系数(在上面的情况下z[2]
)必须为1,该怎么办?或者我需要从头开始编写拟合?
5条答案
按热度按时间uqzxnwby1#
在本例中,我将使用
curve_fit
或lmfit
;我很快就把它展示给第一个。这将打印:
因此,在无约束的情况下,
polyfit
和curve_fit
给予相同的结果(只是顺序不同),在约束的情况下,固定参数为2,如所需。该图看起来如下:
在
lmfit
中,您还可以选择是否应该拟合参数,因此您也可以将其设置为所需的值(选中this answer)。mu0hgdu02#
为了完整起见,使用
lmfit
的解决方案如下所示:它将打印一份综合报告,包括不确定性、相关性和拟合统计数据,如:
并生成
图
请注意,
lmfit.Model
比curve_fit
有许多改进,包括基于函数参数自动命名参数,允许任何参数有边界或简单地固定,而不需要像具有几乎相等的上限和下限这样的废话。关键是lmfit使用具有属性的Parameter对象,而不是拟合变量的普通数组。lmfit还支持数学约束,复合模型(例如,添加或乘以模型),并具有上级的报告。5m1hhzi43#
抱歉复活
但我觉得这个答案不见了
为了拟合多项式,我们求解以下方程组:
这是一个形式为
V @ a = y
的问题其中“V”是范德蒙矩阵:
“y”是保持y值的列向量:
..并且“a”是我们正在求解的系数的列向量:
这个问题可以用线性最小二乘法解决,如下所示:
..产生与polyfit方法相同的解决方案:
相反,我们需要一个解决方案,其中
a2 = 1
将
a2 = 1
从答案的开始代入方程组,然后将相应的项从lhs移动到rhs,我们得到:这对应于如下从范德蒙矩阵中移除列2并从y向量中减去它:
请注意,我在解决线性最小二乘问题后在系数向量中插入了1,我们不再求解
a2
,因为我们将其设置为1并将其从问题中删除。为了完整起见,这是绘制时的解决方案:
我使用的完整代码:
f0brbegy4#
下面是一个使用
scipy.optimize.curve_fit
的方法:首先,让我们重新创建您的示例(作为健全性检查):
它与从
np.polyfit()
得到的值匹配。现在添加
x1
的约束:我必须使用
.999999999
,因为下限必须严格小于上限。或者,您可以将约束系数定义为常数,并获得其他3个的值:
yzxexxkh5#
这里有一个使用
scipy.optimize.curve_fit
的通用方法,目的是固定所需的多项式系数。两个简单的例子来说明如何使用上面的函数: