scipy の splrep 関数について質問がありますが、これはバグだと思います。すべてのコードを投稿して、コンピューターで再現できるようにします。いくつかのデータの b スプライン表現を見つけたいとします。たとえば、次のコードで取得したものです。これは、10 個のガウス分布といくつかのノイズが追加された混合物としてデータセットを作成します。
import numpy as np
# First we define the number of datapoints:
ndata = 100
x = np.arange(0,1,1./np.double(ndata))
means = np.random.uniform(0,1,10)
y = 0.0
for i in range(len(means)):
y = y+np.exp(-(x-means[i])**2./0.01)
# We add some noise to obtain the data:
data = y + np.random.normal(0,0.05,len(y))
次のように表示されます:
それでは、splrep 関数と splev 関数を使用して、この曲線の b-スプライン表現を取得しましょう。
from scipy.interpolate import splrep,splev
# First define the number of knots. Let's put, say, 10 knots:
nknots = 10
# Now we crate the array of knots:
knots = np.arange(x[1],x[len(x)-1],(x[len(x)-1]-x[1])/np.double(nknots))
tck = splrep(x,data,t=knots)
fit = splev(x,tck)
ここまですべてをプロットすると、すべて問題ないように見えます。
ただし、データポイントの数とノットの数の特定の組み合わせには問題があります。たとえば、上記のコードを
ndata = 1931
とnknots = 796
で試すと、次のエラーが発生します。
File "/usr/lib/python2.7/dist-packages/scipy/interpolate/fitpack.py", line 465, in
splrep raise _iermess[ier][1](_iermess[ier][0])
ValueError: Error on input data
上記のコードは自動化できないため、これは問題を引き起こしています。私は、〜19000のデータポイントを持つデータセットで遊んでいます。ここで、とのサイクルwhile
は非常に計算量が多い可能性があります。だから私の質問は:try
except
- この問題を再現できますか? できれば...
- 何が起こっているか知っていますか?