- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个实验数据,我正在尝试使用 scipy 中的 UnivariateSpline 函数拟合曲线。数据如下:
x y
13 2.404070
12 1.588134
11 1.760112
10 1.771360
09 1.860087
08 1.955789
07 1.910408
06 1.655911
05 1.778952
04 2.624719
03 1.698099
02 3.022607
01 3.303135
这是我正在做的:
import matplotlib.pyplot as plt
from scipy import interpolate
yinterp = interpolate.UnivariateSpline(x, y, s = 5e8)(x)
plt.plot(x, y, 'bo', label = 'Original')
plt.plot(x, yinterp, 'r', label = 'Interpolated')
plt.show()
是这样的:
我想知道是否有人考虑过 scipy 可能具有的其他曲线拟合选项?我对 scipy 比较陌生。
谢谢!
最佳答案
有几个问题。
第一个问题是 x 值的顺序。从 scipy.interpolate.UnivariateSpline
的文档中我们发现
x : (N,) array_like
1-D array of independent input data. MUST BE INCREASING.
压力是我加的。对于您提供的数据,x 的顺序相反。要对此进行调试,使用“正常”样条曲线来确保一切都有意义是很有用的。
第二个问题,也是与您的问题更直接相关的一个,与 s 参数有关。它有什么作用?我们再次从文档中找到
s : float or None, optional
Positive smoothing factor used to choose the number of knots. Number
of knots will be increased until the smoothing condition is satisfied:
sum((w[i]*(y[i]-s(x[i])))**2,axis=0) <= s
If None (default), s=len(w) which should be a good value if 1/w[i] is
an estimate of the standard deviation of y[i]. If 0, spline will
interpolate through all data points.
所以 s 决定了插值曲线必须在最小二乘意义上接近数据点的程度。如果我们将值设置得非常大,则样条曲线不需要靠近数据点。
作为一个完整的例子,请考虑以下
import scipy.interpolate as inter
import numpy as np
import pylab as plt
x = np.array([13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
y = np.array([2.404070, 1.588134, 1.760112, 1.771360, 1.860087,
1.955789, 1.910408, 1.655911, 1.778952, 2.624719,
1.698099, 3.022607, 3.303135])
xx = np.arange(1,13.01,0.1)
s1 = inter.InterpolatedUnivariateSpline (x, y)
s1rev = inter.InterpolatedUnivariateSpline (x[::-1], y[::-1])
# Use a smallish value for s
s2 = inter.UnivariateSpline (x[::-1], y[::-1], s=0.1)
s2crazy = inter.UnivariateSpline (x[::-1], y[::-1], s=5e8)
plt.plot (x, y, 'bo', label='Data')
plt.plot (xx, s1(xx), 'k-', label='Spline, wrong order')
plt.plot (xx, s1rev(xx), 'k--', label='Spline, correct order')
plt.plot (xx, s2(xx), 'r-', label='Spline, fit')
# Uncomment to get the poor fit.
#plt.plot (xx, s2crazy(xx), 'r--', label='Spline, fit, s=5e8')
plt.minorticks_on()
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()
关于python - 在 scipy python 中使用 UnivariateSpline 拟合数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913330/
我正在研究一个简单的函数来拟合 yield 曲线。我正在使用 Scipy.interpolate.UnivariateSpline 来完成任务。该函数应返回特定时间间隔(到期日)的 yield 值。
我有一堆代表 sigmoidal 函数的 x, y 点: x=[ 1.00094909 1.08787635 1.17481363 1.2617564 1.34867881 1.43562
我正在使用 UnivariateSpline 为我拥有的一些数据构造分段多项式。然后我想在其他程序(C 或 FORTRAN 中)中使用这些样条,因此我想了解生成的样条背后的方程式。 这是我的代码: i
我正在尝试将一些 MatLab 代码移植到 Scipy,并且我尝试了 scipy.interpolate 中的两个不同函数,interp1d和 UnivariateSpline . interp1d
我尝试使用 SciPy 的平滑单变量样条 from scipy.interpolate import UnivariateSpline spl = UnivariateSpline(x, y) 我收到
我在尝试使用 UnivariateSpline 函数插入数据时遇到了一个奇怪的问题。通过所有点进行插值 (s=0) 和样条函数不会给出整个数据集的结果。 s>=1 的结果也很奇怪。因为我认为它与我正在
scipy UnivariateSpline 不允许多值 X。我读到这已更改,但似乎对我不起作用。我用的是最新版本,刚刚用pip尝试下载,说我有最新版本。 我曾尝试将 s(平滑)从 0 和 None(
我正在尝试使用 UnivariateSpline 函数为某些数据(原始布拉格峰)生成拟合。这是我的代码: import matplotlib.pyplot as plt from scipy impo
我正在尝试使用 SciPy 的 UnivariateSpline 来定位曲线上的一个点。不幸的是,我的结果是 nan。 这是一个最小的例子: from scipy.interpolate import
我无法让 scipy.interpolate.UnivariateSpline 在插值时使用任何平滑。基于function's page以及一些previous posts ,我相信它应该使用 s 参
我正在将用 R 编写的脚本移植到 Python。在 R 中,我使用 smooth.spline,在 Python 中,我使用 SciPy UnivariateSpline。它们不会产生相同的结果(即使
我有一个实验数据,我正在尝试使用 scipy 中的 UnivariateSpline 函数拟合曲线。数据如下: x y 13 2.404070 12 1.588134 1
当 spline = UnivariateSpline(x, y, bbox=[0,1], k=3.0,s=0.0) 对比 spline = UnivariateSpline(x, y, k=3.0,
scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0,
我正在使用 scipy.interpolate.UnivariateSpline平滑地插入大量数据。效果很好。我得到一个像函数一样运行的对象。 现在我想保存样条点以备后用,并在不需要原始数据的情况下在
我是一名优秀的程序员,十分优秀!