曲线fi的估计值

2024-10-03 17:26:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图编写一些非常基本的Python代码,根据输入和输出的样本输出一个数字。例如,如果:

x  = [1, 2, 3, 4, 5]
y = [2, 5, 10, 17, 26]

z = np.interp(7, xp, yp)
print(z)  ##expected 50, actual was 26

我想找到一个最佳拟合函数,把这些值映射到一起,这样我就可以传递另一个x值,得到y值的粗略近似值。我试着读了关于^{}的文章,但据我所知,这不是我应该使用的,因为它使用了一个预定义的函数,在我的例子中我没有。在

注意,我对函数是否应该是线性的/周期的/二次的等等没有限制,因为我的值会变化,但是我的假设是大多数函数应该是线性的。在

我也尝试了^{},但是我只得到y数组中的最后一个值,无论是{}我输入什么。在

编辑:在搞乱了Cleb的答案,然后将其与kennytm的原始方法进行了比较之后,我的发现是enter image description here这里最准确的技术应该是最接近红线的函数。绿线代表kennytm的方法(二次回归是我尝试过的最精确的方法),黑线代表Cleb的技术(单变量PLINE)。看来,由于单变量样条线没有基础模型的先验知识,因此它在适应函数值方面稍好一点,这使得函数的精确度有所提高。在


Tags: 方法函数代码np代表线性数字技术
2条回答

另一个选择是使用样条曲线,例如scipy.interpolate.UnivariateSpline,如果你不关心底层模型(例如它是线性的、立方的等等)和过拟合。在

然后你就可以:

from scipy.interpolate import UnivariateSpline

x  = [1, 2, 3, 4, 5]
y = [2, 5, 10, 17, 26]
spl = UnivariateSpline(x, y)

要获得x=7的估计值,现在只需执行以下操作:

^{pr2}$

返回预期值:

array(49.99999999999993)

这种方法避免了模型的定义。在

I tried reading about scipy.optimize.curve_fit but as far as I can tell, this isn't what I should be using because this uses a predefined function which in my case I don't have.

实际上,scipy.optimize.curve_fit的函数就是您想要适应的模型。假设您需要线性回归,然后使用:

def linear(x, a, b):
    return a*x + b

fit_params, _ = scipy.optimize.curve_fit(linear, xp, yp)
print(linear(7, *fit_params))
# 36.0

类似于二次回归等:

^{pr2}$

curve_fit的第二个返回值是输出的协方差矩阵,它给出了拟合的大致情况)


如果你只想用最小二乘法拟合多项式,你可以用use ^{}。在

linear_coeff = numpy.polyfit(xp, yp, deg=1)
print(numpy.polyval(linear_coeff, 7))
# 35.999999999999986

quadratic_coeff = numpy.polyfit(xp, yp, deg=2)
print(numpy.polyval(quadratic_coeff, 7))
# 50.000000000000085

相关问题 更多 >