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

时间:2012-09-26 11:44:15

标签: python scipy interpolation 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()

图表显示如下:

interpolation-plot

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

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

4 个答案:

答案 0 :(得分: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 :(得分:2)

答案是否定的,没有好的"记下公式的方法,或者至少不是短暂的方式。某些类型的插值(如RBF和Loess)不会直接搜索适合数据的参数数学函数,而是根据其他点分别计算每个新数据点的值。

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

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

答案 2 :(得分:1)

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

但是,我怀疑你能找到一个多项式来表示你的结果。

如果你想尝试不同的插值方法,请检查相应的Scipy documentation,它提供RBF的链接,样条线......

答案 3 :(得分:0)

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