代码之家  ›  专栏  ›  技术社区  ›  Ethunxxx

scipy.interpolate.griddata和scipy.interpolate.Rbf之间的差异

  •  1
  • Ethunxxx  · 技术社区  · 7 年前

    Scipy函数 griddata Rbf 两者都可以用来插值随机散乱的n维数据。 他们之间有什么区别?他们中的一个在准确性或性能上更优秀吗?

    国际海事组织,这不是 this question ,因为我不是问如何执行插值,而是问两种特定方法之间的技术差异是什么。

    1 回复  |  直到 7 年前
        1
  •  2
  •   xdze2    7 年前

    griddata 基于 Delaunay triangulation 提供的点。然后在每个单元(三角形)上插值数据。例如,对于二维函数和线性插值,三角形内的值是穿过三个相邻点的平面。

    rbf 通过为每个提供的点指定一个径向函数来工作“径向”表示函数仅取决于到点的距离。任何点的值都是由所有提供点的加权贡献之和得到的。只要定义了距离函数,无论变量空间的维数是多少,该方法都是适用的。

    example rbf gauss

    该图是基于高斯的插值的一个例子,在1D中只有两个数据点(黑点)。两个高斯(虚线)是使用的基函数。插值函数(红色实线)是这两条曲线的和。每个点的权重由一个线性方程组内部确定,高斯函数的宽度作为点之间的平均距离。

    下面是生成图形的代码:

    import numpy as np
    from matplotlib import pyplot as plt
    %matplotlib inline
    
    from scipy.interpolate import Rbf
    
    x, y = [0, 1], [1, 2]
    
    x_fine = np.linspace(-1, 2, 71)
    
    interp_fun = Rbf(x, y, function='gaussian')
    
    y_fine = interp_fun(x_fine)
    
    for x0, weight in zip( x, interp_fun.nodes ):
        plt.plot(x_fine, weight*interp_fun._function(x_fine-x0), '--k', alpha=.7)
    
    plt.plot(x_fine, y_fine, 'r', label='RFB Gaussian')
    plt.plot(x, y, 'ok');
    plt.xlabel('x'); plt.ylabel('y'); plt.legend();