我应该使用哪个 library/function 来为我的数据拟合多元多项式?
Which library/function should I use to fit a multivariate polynom to my data?
我有依赖于 4 个自变量 (x1,x2,x3,x4) 的数据,我需要一个模型(在 Python 中可用)来评估外部的 f(x1,x2,x3,x4)数据点。原则上,如果我将 3 个变量设置为常数值,我总是可以使用合理次数(<5)的多项式拟合来对剩余维度中的数据进行插值,因此我想生成一个能够插值的函数使用多元多项式拟合一次计算所有维度。必须注意的是,底层函数是非线性的(这意味着我应该期望形式为 x1^n*x2^m 的项,其中 n、m 不为 0)。你有什么建议?
为了说明,我包含了一小部分数据样本:
(请注意,有些变量似乎是常数,这是因为这只是一个小样本)
x1 x2 x3 x4 f
15 10 5 3 0.621646
15 10 5 5 0.488879
15 10 5 10 0.490204
15 10 7 0 0.616027
15 10 7 0.5 0.615497
15 10 7 1 0.619804
15 10 7 3 0.614494
15 10 7 5 0.556772
15 10 7 10 0.555393
15 20 0.5 0 0.764692
15 20 0.5 0.5 0.78774
15 20 0.5 1 0.799749
15 20 0.5 3 0.567796
15 20 0.5 5 0.328497
15 20 0.5 10 0.0923708
15 20 1 0 0.802219
15 20 1 0.5 0.811475
15 20 1 1 0.822908
15 20 1 3 0.721053
15 20 1 5 0.573549
15 20 1 10 0.206259
15 20 2 0 0.829069
15 20 2 0.5 0.831135
15 0 7 1 0.240144
15 0 7 3 0.258186
15 0 7 5 0.260836
您可以使用 scipy.optimize.curve_fit()
函数进行多元曲线拟合。它有据可查,在 Whosebug 上有多个关于使用它进行多元拟合的问题和答案。
对于你的情况,这样的事情可以帮助你开始
import numpy
from scipy.optimize import curve_fit
# Example function to fit to your data
def non_linear_func(x, a, b, c, d):
return x[0] ** a * x[1] ** b + x[2] ** c + x[3] ** d
# X is your multivariate x data
# f is your y data
# p0 is an initial guess for your a,b,c,d... in your fitting function
p0 = [1,2,3,4]
fitParams, fitCov = curve_fit(non_linear_func, X, y, p0=p0)
有几点需要注意,您需要确保传递给 curve_fit()
的 X
和 y
具有正确的尺寸。 X
的维度必须为 N x M,其中 N 是您拥有的数据点数,M 是您拥有的自变量数。 y
应该是长度 N.
您还必须根据您想要的形式定义拟合函数,并尝试给出初步猜测,p0
,用于函数中的参数以帮助 curve_fit
找到最优值。
希望对您有所帮助,在 Whosebug 上有很多关于 curve_fit()
多元拟合的好答案(参见 and ) and the curve_fit documentation 也应该有帮助。
我有依赖于 4 个自变量 (x1,x2,x3,x4) 的数据,我需要一个模型(在 Python 中可用)来评估外部的 f(x1,x2,x3,x4)数据点。原则上,如果我将 3 个变量设置为常数值,我总是可以使用合理次数(<5)的多项式拟合来对剩余维度中的数据进行插值,因此我想生成一个能够插值的函数使用多元多项式拟合一次计算所有维度。必须注意的是,底层函数是非线性的(这意味着我应该期望形式为 x1^n*x2^m 的项,其中 n、m 不为 0)。你有什么建议?
为了说明,我包含了一小部分数据样本:
(请注意,有些变量似乎是常数,这是因为这只是一个小样本)
x1 x2 x3 x4 f
15 10 5 3 0.621646
15 10 5 5 0.488879
15 10 5 10 0.490204
15 10 7 0 0.616027
15 10 7 0.5 0.615497
15 10 7 1 0.619804
15 10 7 3 0.614494
15 10 7 5 0.556772
15 10 7 10 0.555393
15 20 0.5 0 0.764692
15 20 0.5 0.5 0.78774
15 20 0.5 1 0.799749
15 20 0.5 3 0.567796
15 20 0.5 5 0.328497
15 20 0.5 10 0.0923708
15 20 1 0 0.802219
15 20 1 0.5 0.811475
15 20 1 1 0.822908
15 20 1 3 0.721053
15 20 1 5 0.573549
15 20 1 10 0.206259
15 20 2 0 0.829069
15 20 2 0.5 0.831135
15 0 7 1 0.240144
15 0 7 3 0.258186
15 0 7 5 0.260836
您可以使用 scipy.optimize.curve_fit()
函数进行多元曲线拟合。它有据可查,在 Whosebug 上有多个关于使用它进行多元拟合的问题和答案。
对于你的情况,这样的事情可以帮助你开始
import numpy
from scipy.optimize import curve_fit
# Example function to fit to your data
def non_linear_func(x, a, b, c, d):
return x[0] ** a * x[1] ** b + x[2] ** c + x[3] ** d
# X is your multivariate x data
# f is your y data
# p0 is an initial guess for your a,b,c,d... in your fitting function
p0 = [1,2,3,4]
fitParams, fitCov = curve_fit(non_linear_func, X, y, p0=p0)
有几点需要注意,您需要确保传递给 curve_fit()
的 X
和 y
具有正确的尺寸。 X
的维度必须为 N x M,其中 N 是您拥有的数据点数,M 是您拥有的自变量数。 y
应该是长度 N.
您还必须根据您想要的形式定义拟合函数,并尝试给出初步猜测,p0
,用于函数中的参数以帮助 curve_fit
找到最优值。
希望对您有所帮助,在 Whosebug 上有很多关于 curve_fit()
多元拟合的好答案(参见