0

かなり間接的な方法でデータを適合させる必要があります。近似で復元される元のデータは、小さな振動とドリフトを伴う線形関数であり、これを特定したいと思います。これをf(t)と呼びましょう。このパラメータを実験に直接記録することはできませんが、間接的にのみ記録できます。たとえば、g(f)= sin(af(t))とします。(実際の転送機能はより複雑ですが、ここでは役割を果たさないはずです)

したがって、f(t)がsin関数の転換点に向かって方向を変える場合、特定するのは困難であり、gの逆関数といくつかのデータの推測を継続するよりも、f(t)を回復するための代替アプローチを試しました。

同じ既知の伝達関数g()を実行し、g(fm(t))をデータに適合させるモデル関数fm(t)を作成します。データセットは巨大であるため、データの連続するチャンクに対してこれを区分的に行い、セット全体でfmの連続性を保証します。

最初の試みは、optimize.leastsqを使用して線形関数を使用することでした。ここで、誤差推定値はg(fm)から導出されます。完全に満足できるものではありません。データとその導関数の連続性を保証するf(t)のモデルとしてfspline(t)を取得するには、スプラインをデータに適合させる方がはるかに良いと思います。

問題は、補間パッケージからのスプラインフィッティングがデータに直接作用するため、g(fspline)を使用してスプラインをラップし、これに対してスプライン補間を実行できないことです。これをscipyで実行できる方法はありますか?

他のアイデアはありますか?

二次関数を試し、前のフィッティングされたデータのチャンクのものと一致するようにオフセットとスロープを修正したので、フィッティングパラメータは曲率だけで、すぐに逸脱し始めます。

ありがとう

4

2 に答える 2

0

必要なのはスプライン基底関数の行列b(t)であるため、f(t)をスプライン基底関数の線形結合として近似できます。

f(t) = np.dot(b(t), coefs)

次に、optimize.leastsqを使用して、係数coefsを推定します。

ただし、私が知る限り、スプライン基底関数はPythonではすぐには利用できません(実験的なスクリプトを借りたり、一部のパッケージのコードを検索したりしない限り)。

代わりに、たとえば多項式を使用することもできます

b(t) = np.polynomial.chebvander(t, order) 

スプラインの代わりに多項式近似を使用します。

この問題の構造は、gが既知のリンク関数であり、計量経済学のインデックス問題に似ている一般化線形モデルに非常に似ています。

人工データを作成すると、scipyスプラインを間接的に使用できるようになります

y_i = f(t_i) 

ここで、f(t_i)はscipy.interpolateスプラインであり、y_iは最小二乗最適化で推定されるパラメーターです。(Scipyバージョンとは異なる種類の平滑化スプラインを作成するためにこれを使用した、以前に見たスクリプトに大まかに基づいています。これをどこで見たかは覚えていません。)

于 2012-07-07T03:30:03.423 に答える
0

これらのコメントをありがとう。上で提案した多項式基底を試しましたが、多項式は私のニーズに合ったオプションではありません。広告はリンギングを作成する傾向があり、調整が困難です。

私が今見つけたスプラインの使用に関する解決策は非常に単純で簡単であり、それは「間接的な方法でスプラインを使用する」という意味だと思います。

フィッティング関数f(t)は、interpolate.splev(x、(t、c、k))関数によって取得されますが、omptimize.leastsq関数によってスプライン係数cを提供します。このように、f(t)は(通常splrep(x、y)関数で得られるように)直接スプラインフィットではありませんが、フィットで間接的に最適化されるため、リンク関数gを使用できます。cの初期推定値は、モデルデータに対するsplrep(xinit、yinit、t = knots)の1つの評価によって取得される可能性があります。

1つのトリックは、splrep()の関数呼び出し中に明示的に指定し、splev()を使用した評価中にこの削減されたセットを与えることにより、スプラインのノットの数をデータポイントの数より少なく制限することです。

于 2012-07-13T07:23:24.630 に答える