使用scipy.interpolate.Rbf()进行的插值不精确

4
当我执行以下代码时:
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import Rbf

x_coarse, y_coarse = np.mgrid[0:5, 0:5]
x_fine, y_fine = np.mgrid[1:4:0.23,1:4:0.23]
data_coarse = np.ones([5,5])

rbfi = Rbf(x_coarse.ravel(), y_coarse.ravel(), data_coarse.ravel())

interpolated_data = rbfi(x_fine.ravel(), y_fine.ravel()).reshape([x_fine.shape[0], 
                                                                  y_fine.shape[0]])

plt.imshow(interpolated_data)

数组interpolated_data的值范围从0.988到1.002,相应的图形如下所示:

Plot of the array 'data_fine'

然而,在这种简单的插值情况下,我希望插值值更接近正确的值,即1.000。
我认为插值值的变化是由于插值点到给定数据点的不同距离引起的。
我的问题是:有没有办法避免这种行为?如何获得一种不受插值点与数据点距离加权影响的插值方法,并在interpolated_data中得到1.000的值?

请查看此答案中的第一个图表(类似的示例,但是在1D中):https://stackoverflow.com/a/51653039/8069403。它看起来像是在最后一个点之前出现了相同的超调。(基础函数不同。)您尝试过[`griddata`](https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.interpolate.griddata.html)吗? - xdze2
1个回答

5
我希望在这种简单的插值情况下能够实现预期的结果。
这是一个不合理的期望。RBF插值使用径向基函数,顾名思义,它使用径向基函数。默认情况下,基函数为sqrt((r/epsilon)**2 + 1),其中r是数据点距离,epsilon是正参数。这样的函数加权和不可能恒定。RBF插值不像线性或双线性插值。它适用于粗糙的数据,是一种粗略的插值方法。
通过设置一个荒谬的大epsilon,你可以更接近1;因为它使得基函数在网格上几乎相同。
rbfi = Rbf(x_coarse.ravel(), y_coarse.ravel(), data_coarse.ravel(), epsilon=10)
# ... 
print(interpolated_data.min(), interpolated_data.max())
# outputs 0.9999983458255883 1.0000002402521204 

然而,这并不是一个好主意,因为当数据是常数时,插值器会受到太多的远程影响。
“gives me nothing but 1.000 in interpolated_data?”是线性插值。与Rbf类似,LinearNDInterpolator具有类似的语法,它返回一个可调用函数。
linear = LinearNDInterpolator(np.stack((x_coarse.ravel(), y_coarse.ravel()), axis=-1), 
                              data_coarse.ravel())
interpolated_data = linear(x_fine.ravel(), y_fine.ravel()).reshape([x_fine.shape[0], y_fine.shape[0]])
print(interpolated_data.min(), interpolated_data.max())
# outputs 1.0 1.0 

此外,还有一个griddata函数,它提供了更多的插值模式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接