scipy UnivariateSpline无法处理多值X。

7

scipy UnivariateSpline不允许出现多值X。我看到有人说这个问题已经解决了,但是对我似乎没有用。我正在使用最新版本,刚刚使用pip尝试下载,显示我已经拥有最新版本。

我尝试将s(平滑参数)从0和None(X必须严格递增)更改,但这并没有解决问题。

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline

x=[152,152,152,152,152,159,159,159,159,159,166,166,166,166,166,174,174,174,174,174,181,181,181,181,181,188,188,188,188,188,194,194,194,194,194,202,202,202,202,202,208,208,208,208,208,215,215,215,215,215,222,222,222,222,222,229,229,229,229,229,236,236,236,236,236,243,243,243,243,243,250,250,250,250,250,258,258,258,258]

y=[-1.31639523,-1.90045889,-1.81769285,-1.25702203,-1.31975784,-0.76206863,-0.74170737,-0.66029284,-0.58124809,-0.49593701,-0.19309943,0.02254396,-0.04614866,0.06709774,0.10436002,0.577175,0.56809403,0.89547559,0.60922195,0.76220672,1.0461253,1.1304339,1.56360338,1.34189828,1.41658105,1.98677786,2.40487089,2.20431052,1.91072699,2.49328809,2.670556,2.85024397,3.24333426,2.44841554,3.14604703,3.39128172,3.78063788,3.21446612,3.07158159,3.79503965,3.40717945,4.02417242,3.70708767,4.00729682,4.25504517,4.28874564,3.9356614,4.30337567,4.02388633,4.65376986,4.33884509,4.68839858,4.10508666,4.26236997,4.53098529,5.03443645,4.07940011,4.3033351,4.43476139,4.80221614,4.49558967,4.5052504,4.40289487,5.15433152,5.1330299,4.30299696,4.47974301,5.34886789,4.60896298,5.35997675,4.40204983,5.50162549,4.3056854,4.87120463,5.36265274,4.33578634,5.06347439,4.46811258,5.30920785]

s = 0.1 # set smoothing to non-zero
spl = UnivariateSpline(x, y, s=s)

我收到了这个错误信息- spl = UnivariateSpline(x, y, s=s) File "C:\Python37\lib\site-packages\scipy\interpolate\fitpack2.py", line 177, in __init__ raise ValueError('x must be strictly increasing') ValueError: x must be strictly increasing.

欢迎提供任何帮助或建议!

2个回答

5

知道了! 经过多小时查看代码,我找到了一个链接https://github.com/kawache/Python-B-spline-examples,这给了我一个线索,现在我可以产生类似于我的原始FORTRAN代码(使用M.G. Cox原始代码1编写,并随后修改为Cox&de Boor 2)的结果。

也许我应该写成“对不同时刻连续不规则点的多次观测数据进行样条拟合”。

感谢您对此的所有帮助。

这是我的代码:-

import matplotlib.pyplot as plt
from scipy import interpolate
import numpy as np

x=[152.0,152,152,152,152,159,159,159,159,159,166,166,166,166,166,174,174,174,174,174,181,181,181,181,181,188,188,188,188,188,194,194,194,194,194,202,202,202,202,202,208,208,208,208,208,215,215,215,215,215,222,222,222,222,222,229,229,229,229,229,236,236,236,236,236,243,243,243,243,243,250,250,250,250,250,258,258,258,258]

y=[-1.31639523,-1.90045889,-1.81769285,-1.25702203,-1.31975784,-0.76206863,-0.74170737,-0.66029284,-0.58124809,-0.49593701,-0.19309943,0.02254396,-0.04614866,0.06709774,0.10436002,0.577175,0.56809403,0.89547559,0.60922195,0.76220672,1.0461253,1.1304339,1.56360338,1.34189828,1.41658105,1.98677786,2.40487089,2.20431052,1.91072699,2.49328809,2.670556,2.85024397,3.24333426,2.44841554,3.14604703,3.39128172,3.78063788,3.21446612,3.07158159,3.79503965,3.40717945,4.02417242,3.70708767,4.00729682,4.25504517,4.28874564,3.9356614,4.30337567,4.02388633,4.65376986,4.33884509,4.68839858,4.10508666,4.26236997,4.53098529,5.03443645,4.07940011,4.3033351,4.43476139,4.80221614,4.49558967,4.5052504,4.40289487,5.15433152,5.1330299,4.30299696,4.47974301,5.34886789,4.60896298,5.35997675,4.40204983,5.50162549,4.3056854,4.87120463,5.36265274,4.33578634,5.06347439,4.46811258,5.30920785]

plt.plot(x, y, 'ro', ms=5)

tck,u = interpolate.splprep([x,y],k=3,s=32)

u=np.linspace(0,1,num=50,endpoint=True)
out = interpolate.splev(u,tck)

plt.plot(x, y, 'ro', out[0], out[1], 'b' )

plt.show()

并给出原始 Cox 1 和 de Boor 2 样条曲线的图形。 1: M. G. Cox, “B样条的数字计算”, J. Inst. Maths Applics, 10, p.134-149, 1972. 2: C. de Boor, “使用B样条进行计算”, J. Approximation Theory, 6, p.50-62, 1972. 来自Python代码结果的图形。 来自Cox&De Boor原始Fortran代码结果的图形

0

这个方法在你的数据集上不起作用。它需要一个连续增加的x变量来进行插值。这是实现的要求。

  • 你可以编辑数据集以删除重复的x值,然后它就能工作了。或者你可以尝试下面的方法,这个方法更加复杂。

@xdze2提供的答案介绍了使用各个坐标点来平滑曲线的替代方法。

在给定曲线的每个坐标上分别拟合样条曲线


谢谢Bamdan,正如你所说,我已经尝试了最新版本,但没有效果。我读的文章就是你给的链接。我不确定这是否是一个bug - 也许是一个“特性”!如果是这样,我不知道该尝试什么 - 任何帮助都将不胜感激。 - itpme
啊,好的,很抱歉没有帮到你。我稍后会看一下并告诉你。似乎有几种优化方法受到了同样的问题影响。谢谢。 - bamdan
感谢 A. Nadjar 为我重新格式化问题 - 我需要学习如何做到这一点! - itpme
1
这似乎是软件的限制,我不认为这是数学要求。当将X中的所有点用作节点时,可能会出现问题,但是当节点少于X中唯一值时,则没有问题。请参见De Boor算法(顺便说一句,它可以与我的数据一起使用)并允许平滑处理,因此我很惊讶scipy例程无法运行。 在使用FITPACK的R中似乎没有问题。我可以尝试在X中的每个点处使用所有Y值的平均值,并根据每个X上的(最大计数-计数)调整权重。谢谢您的帮助。 - itpme
你看过https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.interpolate.BSpline.html#scipy.interpolate.BSpline吗?在这种情况下,它会有用吗? - bamdan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接