【问题标题】:Python: Bivariate Spline not on grid dataPython:双变量样条不在网格数据上
【发布时间】:2013-07-26 13:15:49
【问题描述】:

我有一个数据集 (X,Y) -> Z。因此,我想在 Python 中学习 2D 输入和输出 Z 之间的映射。

我知道底层函数不是线性的,因此我不能应用线性回归。由于输入数据只有 2D,我想使用 二元样条。我实现了以下示例:

import numpy
from scipy import interpolate
X = [1,2,1,2]
Y = [1,2,2,1]
Z = [1,2,1,2]
Y = numpy.array(Y)
X = numpy.array(X)
Z = numpy.array(Z) 
tck = interpolate.bisplrep(X,Y,Z)#,kx=5,ky=2)
print interpolate.bisplev(1.5,1.5,tck) 

但是,上面的代码会引发以下错误:

  File "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", line 850, in bisplrep
    TypeError: m >= (kx+1)(ky+1) must hold

问题在于二元样条scipyimplementation需要网格数据作为输入,而不是输入序列的普通数组,比如X = [x1, x2,.. .] 和 Y = [y1,y2,...]。由于我可用的数据类型,我无法构建网格,因为输入数据没有定期分发。

如何使用不是网格的输入数据进行 二元样条

如果不可能,是否有另一种方法可以在 Python 中进行 2D 样条/多项式拟合/非线性回归?

【问题讨论】:

    标签: python numpy scipy regression spline


    【解决方案1】:
    TypeError: m >= (kx+1)(ky+1) must hold
    

    表示您提供的点太少,而不是数据必须是网格数据。 m 等于 len(X)(或 len(Y),或 len(Z))。 kxky 控制样条的度数。

    因此,例如,如果您增加xyz 的长度:

    import scipy.interpolate as interpolate
    
    x = [1,2,1,2,1,3,2,3,3]
    y = [1,2,2,1,3,1,3,2,3]
    z = [1,2,1,2,0,0,0,0,0]
    
    kx, ky = 2, 2  # spline order
    assert len(x) >= (kx+1)*(ky+1)
    
    tck = interpolate.bisplrep(x, y, z, kx=kx, ky=ky)
    print(interpolate.bisplev(1.5,1.5,tck))
    

    打印

    2.109375
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2018-05-06
      • 2011-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-28
      相关资源
      最近更新 更多