【问题标题】:scipy UnivariateSpline fails with multivalued Xscipy UnivariateSpline 因多值 X 而失败
【发布时间】:2019-08-24 08:07:47
【问题描述】:

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.

欢迎任何帮助或建议!

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    知道了! 在查看代码几个小时后,我发现了一个链接https://github.com/kawache/Python-B-spline-examples,它给了我一个线索,我现在可以产生类似于我原始 FORTRAN 代码的结果(它是使用 M.G. Cox 原始代码 1 编写的,随后修改为考克斯和德布尔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。数学应用,10,第 134-149 页,1972 年。

    2: C. de Boor,“关于使用 b 样条进行计算”,J. 近似理论,6,p.50-62,1972。

    【讨论】:

      【解决方案2】:

      这不适用于您的数据集。它需要一个不断增加的 x 变量来进行插值。这是实现的要求。

      • 您可以编辑数据集以删除重复的 x 值,它会起作用。或者,您可以尝试下面涉及更多的方法。

      @xdze2 的这个答案通过替代方法使用单个坐标来平滑曲线。

      fit a spline separately on each coordinates of the given curve

      【讨论】:

      • 感谢 Bamdan,正如您所指出的,我尝试了最新版本,但无济于事。我阅读的文章是您提供的链接。我不确定这是一个错误 - 也许是一个“功能”!在这种情况下,我不知道该尝试什么 - 任何帮助将不胜感激。
      • 啊,好吧,抱歉,没有帮助。我稍后会看看,让你知道。似乎是受同一问题影响的许多优化方法。谢谢
      • 感谢 A. Nadjar 为我重新格式化问题 - 我需要学习如何做到这一点!
      • 这看起来像是软件中的一个限制,我不认为这是一个数学要求。将 X 中的所有点用作结时可能会出现问题,但当结的数量少于 X 中的唯一值时则不会出现问题。请参阅 De Boor 的算法(顺便使用我的数据)并允许平滑,所以我很惊讶scipy 例程将不起作用。在使用 FITPACK 的 R 中似乎没有问题。我可以尝试使用 X 中每个点的所有 Y 值的平均值,并根据每个 X 的 (maxcount-count) 调整权重。感谢您的帮助。
      • 别担心,这有点烦人好吧。我并不完全熟悉它是如何工作的,但这是一个有趣的领域。我猜这个实现是针对速度优化的,如果允许任何 x,这个特定的优化器可能不会有性能。我已经修改了答案以指向实施要求。你能接受吗?
      猜你喜欢
      • 2014-01-06
      • 2021-04-10
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-23
      相关资源
      最近更新 更多