我试图编写一些非常基本的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
数组中输入的最后一个值。编辑:在搞乱了克莱布的答案,然后将其与肯尼特姆的原始方法进行比较之后,以下是我的发现。这里最准确的技术应该是最接近红线的函数。绿线代表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)
这种方法避免了模型的定义。