11

我在 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()

绘图显示如下:

插值图

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

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

4

5 回答 5

5

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

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

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

于 2012-09-26T12:33:06.117 回答
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插入高斯(或您要求它使用的任何函数)。(您可以检查和的python__call__代码_call_norm

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

于 2012-09-26T14:39:41.720 回答
1

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

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

如果您想尝试不同的插值方法,请查看相应的Scipy 文档,该文档提供了 RBF、样条线的链接...

于 2012-09-26T11:48:38.727 回答
1

我不认为 SciPy 的 RBF 会给你实际的功能。但是您可以做的一件事是对 SciPy 的 RBF 给您的函数进行采样(即 100 分)。然后对这些点使用拉格朗日解释。这将为您生成一个多项式函数。这是一个外观示例。如果不想使用拉格朗日插值,也可以使用“牛顿除数差分法”生成多项式函数。在此处输入图像描述

于 2018-01-01T18:17:07.123 回答
0

我的回答仅基于 numpy:

import matplotlib.pyplot as plt
import numpy as np
x_data = [324, 531, 806, 1152, 1576, 2081, 2672, 3285, 3979, 4736]
y_data = [20, 25, 30, 35, 40, 45, 50, 55, 60, 65]
x =  np.array(x_data)
y = np.array(y_data)
model = np.poly1d(np.polyfit(x, y, 2))
ynew = model(x)
plt.plot(x, y, 'o', x, ynew, '-' , )
plt.ylabel( str(model).strip())
plt.show()
于 2021-10-15T02:20:32.010 回答