Python:不在网格数据上的二元样条曲线

Python:不在网格数据上的二元样条曲线,python,numpy,scipy,regression,spline,Python,Numpy,Scipy,Regression,Spline,我有一个数据集(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

我有一个数据集(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
问题在于,二元样条曲线的
scipy
需要网格数据作为输入,而不是输入序列的正规数组,例如X=[x1,x2,…]和Y=[y1,y2,…]。由于我可用的数据类型,我无法构建网格,因为输入数据没有定期分布

如何使用非网格的输入数据生成二元样条曲线

如果不可能,是否有其他方法在Python中执行2D样条曲线/多项式拟合/非线性回归

TypeError: m >= (kx+1)(ky+1) must hold
这意味着您提供的点太少,而不是数据必须是网格数据
m
等于
len(X)
(或
len(Y)
,或
len(Z)
)。
kx
ky
控制样条曲线的阶数

因此,例如,如果增加
x
y
z
的长度:

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