我有一个数据集(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
implementation需要网格数据作为输入,而不是输入序列的正常数组,例如X = [x1, x2,...]和Y = [y1,y2,...]。由于我可以使用的数据类型,我无法构建网格,因为输入数据不会定期分配。
如何使用不是网格的输入数据执行双变量样条?
如果不可能,是否有其他方法可以在Python中进行2D样条/多项式拟合/非线性回归?
答案 0 :(得分:5)
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