3

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)

ここまですべてをプロットすると、すべて問題ないように見えます。 B-スプラインでフィット ただし、データポイントの数とノットの数の特定の組み合わせには問題があります。たとえば、上記のコードをndata = 1931nknots = 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は非常に計算量が多い可能性があります。だから私の質問は:tryexcept

  1. この問題を再現できますか? できれば...
  2. 何が起こっているか知っていますか?
4

2 に答える 2

2

問題を回避する方法を作成しました。おそらく、2 つのノットの間に収まるデータポイントの数が少ないことに関係しているため、ノットの数を作成する行を次のように置き換えました。

idx_knots = (np.arange(1,len(x)-1,(len(x)-2)/np.double(nknots))).astype('int')
knots = x[idx_knots]

このようにして、x ベクトルのインデックスをいじるので、ノット間に十分なデータポイントがあることを確認します。

于 2013-01-26T16:34:28.983 に答える
1

ノットを (パラメーターを介して) 直接指定する代わりに、tパラメーターを使用できsます。sパラメータは、スプラインの滑らかさを制御します。状態になるまでノット数を増やすことで行います。

sum((w * (y - g))**2,axis=0) <= s

が満たされます (g は平滑化されたスプライン表現、w は重みです)。

于 2013-09-17T09:09:35.347 に答える