我试图编写一些非常基本的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值的粗略近似值。我试着阅读关于scipy.optimize.curve_fit的文章,但据我所知,这不是我应该使用的,因为它使用了一个预定义的函数,而在我的例子中,我没有这个函数。
注意,我对函数是否应该是线性的/周期的/二次的等没有限制,因为我的值会变化,但我的假设是大多数函数应该是线性的。
我也尝试了numpy.interp但是我只得到了y数组中输入的最后一个值。
编辑:在搞乱了克莱布的答案,然后将其与肯尼特姆的原始方法进行比较之后,以下是我的发现。python - 通过曲线拟合估计值-LMLPHP这里最准确的技术应该是最接近红线的函数。绿线代表kennytm的方法(二次回归是我尝试过的最精确的方法),黑线代表Cleb的技术(单变量pline)。看来,由于单变量pline没有对底层模型的先验知识,因此它在适应函数值方面稍微好一点,从而使其更精确一些。

最佳答案

另一种选择是使用样条曲线,例如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的估计值,现在只需执行以下操作:
spl(7)

它返回您期望的值:
array(49.99999999999993)

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

08-24 23:01