python 插值 —— 如何实现插值,以及错误ValueError: A value in x_new is below the interpolation range.

插值

插值,是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。–摘自百度百科

插值与拟合有一定差别,但其目的都是类似的,根据已有数值,生成预测函数,来预测目标值。

下面介绍一下,在Python中如何实现插值。

import scipy.interpolate as spi

# 准备数据,X和Y都是有限离散点集,X与Y是一一对应的
# 我们想用X逼近Y
X 
Y  

# 准备插值点,就是拟合点,用于生成插值函数
# 1)如果(X, Y)有很多,就从X和Y中选择一部分点,作为插值点,选择的时候注意一一对应;
# 2)如果(X, Y)不太多,则可以选择所有点作为插值点;
# 这里由于(X, Y)很庞大,所以选择其中一部分点作为插值点
idx = np.arange(1,len(X)+1, 100)
new_x = [list(X)[i] for i in idx] 
new_y = [list(Y)[i] for i in idx] 

# 生成差值函数
# kind代表插值函数格式,有这几种['linear','zero', 'slinear', 'quadratic', 'cubic', 4, 5]
f = spi.interp1d(X,Y,kind="linear")

# 随便给一个x,预测Y
x = [1000, 2000]
predict_y = f(x)

如果在预测的时候,出现以下报错

ValueError: A value in x_new is below the interpolation range.

原因:在使用上述插值函数 f f f进行预测的时候,所给的x的取值超出了【生成该函数时候所使用的X】的取值范围,函数给不出预测值,因此报错。

解决办法:加上参数fill_value="extrapolate"就可以了,函数会自动推断给出预测值。但是注意:如果需要预测的 Y Y Y不是单调的,使用该参数自动推断出来的预测值 y y y可能会不准确。(因为这里面的自动推断,应该是按照线性单调推断的,这个我还没有确认过)

# fill_value="extrapolate"的意思是当用该函数预测Y时,如果所给x超出【生成该函数时候所使用的X】的取值范围时,该函数会自动推测给出相应的预测值y。
f = spi.interp1d(X,Y,kind="linear",fill_value="extrapolate")
ValueError Traceback (most recent call last) Cell In[52], line 69 67 f = interp1d(B2[0, :], B2[1, :], kind='quadratic') 68 a8 = f(i2) ---> 69 a9 = f(a20) 70 derivative = (a9 - a8) / a7 71 if derivative - a9 > 10e-6: File ~\AppData\Roaming\Python\Python39\site-packages\scipy\interpolate\_polyint.py:80, in _Interpolator1D.__call__(self, x) 59 """ 60 Evaluate the interpolant 61 (...) 77 78 """ 79 x, x_shape = self._prepare_x(x) ---> 80 y = self._evaluate(x) 81 return self._finish_y(y, x_shape) File ~\AppData\Roaming\Python\Python39\site-packages\scipy\interpolate\_interpolate.py:752, in interp1d._evaluate(self, x_new) 750 y_new = self._call(self, x_new) 751 if not self._extrapolate: --> 752 below_bounds, above_bounds = self._check_bounds(x_new) 753 if len(y_new) > 0: 754 # Note fill_value must be broadcast up to the proper size 755 # and flattened to work here 756 y_new[below_bounds] = self._fill_value_below File ~\AppData\Roaming\Python\Python39\site-packages\scipy\interpolate\_interpolate.py:786, in interp1d._check_bounds(self, x_new) 784 if self.bounds_error and above_bounds.any(): 785 above_bounds_value = x_new[np.argmax(above_bounds)] --> 786 raise ValueError("A value ({}) in x_new is above " 787 "the interpolation range's maximum value ({})." 788 .format(above_bounds_value, self.x[-1])) 790 # !! Should we emit a warning if some values are out of bounds? 791 # !! matlab does not. 792 return below_bounds, above_bounds ValueError: A value (0.21347609900000009) in x_new is above the interpolation range's maximum value (0.213476099).该怎么修改,代码怎么写
05-24
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值