3

データセット (X,Y) -> Z があります。したがって、Python で 2D 入力と出力 Z の間のマッピングを学習したいと思います。

基になる関数が線形でないことはわかっているため、線形回帰を適用できません。入力データが 2D しかないので、 2 変量スプラインを使用したいと思います。次の例を実装しました。

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 スプライン/多項式フィッティング/非線形回帰を行う別の方法はありますか?

4

1 に答える 1

5
TypeError: m >= (kx+1)(ky+1) must hold

は、データがグリッド データでなければならないという意味ではなく、指定したポイントが少なすぎるという意味です。は(または、または)mと等しい。 スプラインの次数を制御します。len(X)len(Y)len(Z)kxky

したがって、たとえば、xyおよび の長さを増やすと、次のようになり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
于 2013-07-26T10:51:08.767 に答える