gpt4 book ai didi

Python:不在网格数据上的双变量样条

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:30 26 4
gpt4 key购买 nike

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

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

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 样条/多项式拟合/非线性回归?

最佳答案

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

关于Python:不在网格数据上的双变量样条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17878459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com