2012-09-26 22 views
6

我已经在Python中完成了一些工作,但我是scipy的新手。我试图使用interpolate库中的方法来创建一个近似于一组数据的函数。获取由scipy创建的插值函数的公式

我查阅了一些例子上手,并且可以得到以下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() 

该地块显示如下:

interpolation-plot

现在,是否有任何方法可以获得表示由Rbf创建的插值函数的多项式表达式(即创建为rbf_interp的方法)?

或者,如果Rbf不可能,那么也欢迎使用不同插值方法,另一个库或甚至不同工具的建议。

+0

看看'scipy.interpolate.Rbf'和'scipy.interpolate'模块的文档,我看不到任何与你想要的相关的东西。我能想到的唯一方法是阅读源代码并了解如何根据参数创建函数,然后编写能够返回可读表示的拥有函数。但这取决于实施细节。即使我看不到你如何消除这一点。 – Bakuriu

+0

考虑两个步骤:数据 - >曲线(通过Rbf或其他),然后曲线 - >分段多项式:样条。保存样条参数很容易,(npiece + 1)* 4 - 进一步询问您是否想要这样做。 – denis

回答

4

的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 

可以计算出距离(与rbf.xi然后撑着与因素的距离在rbf.nodesrbf.epsilon到高斯(或任何功能,你问它使用)。(您可以检查的__call___call_norm的Python代码)

所以你喜欢的东西sum(rbf.nodes[i] * gaussian(rbf.epsilon, sqrt((rbf.xi - center)**2)) for i, center in enumerate(rbf.nodes))给一些有趣的半个码/公式,函数的RBFs被写入文件中,但你也可以检查Python代码。

1

RBF可能代表Radial Basis Function。如果scipy.interpolate.Rbf是您正在寻找的功能,我不会感到惊讶。

不过,我怀疑你将能够找到一个多项式来表示你的结果。

如果你想尝试不同的插值方法,检查相应的Scipy documentation,给出链接RBF,花键...

+0

嗨@Pierre,也许我不清楚我的问题。我正在使用'scipy.interpolate.Rbf'。我想知道的是,如果我能以某种方式提取一个代表创建插值函数的公式(例如'exp(x)+ x^3-x^2'等) –

2

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

这些插值保证总是能够很好地适合您的数据(比如您的情况),其原因是要描述它们需要大量的参数(基本上是所有的数据点) 。可以这样考虑:通过用直线连接连续的数据点,可以线性插入。你可以用这种方式适应任何数据,然后用数学形式描述函数,但是它需要大量参数(至少与点数一样多)。其实你现在正在做的是一个平滑的版本。

如果希望公式缩短,这意味着您想用一个没有多个参数的数学函数来描述数据(具体而言,参数的数量应该远远低于数据点的数量)。这些例子是逻辑函数,多项式函数,甚至是正弦函数(用于生成数据)。显然,如果你知道哪个函数产生的数据将是你想要的函数。

+1

您好@Bitwise,当然在上面的代码我知道函数('f(x)= sin(2 * PI * x)+ noise');实际上我有一组数据在CSV中,不知道该函数是什么(我只能根据它的形状进行猜测,就这些) –

+0

@Eduardo是的,这就是我所设想的。重点在于,如果您有一些关于什么样的模型可能适合数据的想法,无论是通过先前的知识还是仅查看数据,都可能指向您应该使用哪种功能类型。否则,它可能是任何事情,你可以做的唯一事情就是尝试不同系列的参数化函数。 – Bitwise

+0

我稍微编辑了我的答案,并添加了一个线性插值的简短示例。 – Bitwise

0

我不认为SciPy的RBF会给你实际的功能。但你可以做的一件事就是对SciPy的RBF给你的函数进行抽样(即100分)。然后用这些点来使用拉格朗日解释。这将为您生成一个多项式函数。这是一个关于如何看起来的例子。如果您不想使用拉格朗日插值,您也可以使用“牛顿差分方法”来生成多项式函数。 enter image description here