获取scipy创建的插值函数的公式

E.Z*_*.Z. 6 python interpolation scipy pythonxy

我在Python中做了一些工作,但我是新手scipy.我正在尝试使用interpolate库中的方法来提供一个近似于一组数据的函数.

我已经查了一些示例来开始,并且可以使用Python(x,y)获得下面的示例代码:

import numpy as np
from scipy.interpolate import interp1d, Rbf
import pylab as P

# show the plot (empty for now)
P.clf()
P.show()

# generate random input data
original_data = np.linspace(0, 1, 10)

# random noise to be added to the data
noise = (np.random.random(10)*2 - 1) * 1e-1

# calculate f(x)=sin(2*PI*x)+noise
f_original_data = np.sin(2 * np.pi * original_data) + noise

# create interpolator
rbf_interp = Rbf(original_data, f_original_data, function='gaussian')

# Create new sample data (for input), calculate f(x) 
#using different interpolation methods
new_sample_data = np.linspace(0, 1, 50)
rbf_new_sample_data    = rbf_interp(new_sample_data)

# draw all results to compare
P.plot(original_data, f_original_data, 'o', ms=6, label='f_original_data')
P.plot(new_sample_data, rbf_new_sample_data, label='Rbf interp')
P.legend()
Run Code Online (Sandbox Code Playgroud)

该图显示如下:

插值积

现在,有没有办法得到一个多项式表达式来表示由Rbf(即创建的方法)创建的插值函数rbf_interp

或者,如果无法做到这一点Rbf,也欢迎使用不同插值方法,其他库或甚至不同工具的任何建议.

Bit*_*ise 5

答案是否定的,没有“好”的方式来写下公式,或者至少没有简短的方式。某些类型的插值(例如 RBF 和 Loess)不会直接搜索参数数学函数来拟合数据,而是分别计算每个新数据点的值作为其他点的函数。

这些插值保证始终能够很好地适合您的数据(例如您的情况),其原因是为了描述它们,您需要大量参数(基本上是所有数据点)。可以这样想:您可以通过用直线连接连续的数据点来进行线性插值。您可以通过这种方式拟合任何数据,然后以数学形式描述该函数,但它需要大量参数(至少与点数一样多)。事实上,你现在所做的几乎是一个平滑版本。

如果你希望公式很短,这意味着你想用一个没有很多参数的数学函数来描述数据(具体来说参数的数量应该远低于数据点的数量)。此类示例包括逻辑函数、多项式函数甚至正弦函数(用于生成数据)。显然,如果您知道哪个函数生成了数据,那么该数据将是您想要拟合的函数。

  • 你好@Bitwise,当然在上面的代码中我知道函数 (`f(x)=sin(2*PI*x)+noise`); 实际上,我在 CSV 中有一组数据,但不知道该函数是什么(我只能根据其形状进行猜测,仅此而已) (3认同)

seb*_*erg 5

RBF 使用您要求的任何函数,它当然是一个全局模型,所以是的,有一个函数结果,但当然您可能不喜欢它,因为它是许多高斯函数的总和。你得到了:

 rbf.nodes   # the factors for each of the RBF (probably gaussians)
 rbf.xi      # the centers.
 rbf.epsilon # the width of the gaussian, but remember that the Norm plays a role too
Run Code Online (Sandbox Code Playgroud)

因此,有了这些东西,你就可以计算距离(rbf.xi然后将距离与因素插入rbf.nodes高斯(或你要求它使用的任何函数)中。(你可以检查和 的rbf.epsilonPython代码)__call___call_norm

所以你会得到类似sum(rbf.nodes[i] * gaussian(rbf.epsilon, sqrt((rbf.xi - center)**2)) for i, center in enumerate(rbf.nodes))给出一些有趣的半代码/公式的东西,RBFs 函数写在文档中,但你也可以检查 python 代码。