3

モンテカルロシミュレーションを実行し、信号強度と時間の曲線を生成するコードを作成しました。このような曲線の形状はさまざまなパラメーターに依存しますが、そのうちの2つは、私がシミュレートしている実験の「実際のバージョン」によって決定したいと考えています。

彼女の実験データを私のシミュレートされた曲線と比較する準備ができていますが、まだフィットを実行できていないため、今は行き詰まっています(これまでのところ、実験データをテストのためにシミュレートされたノイズの多いデータに置き換えました)。コード2で終了するを使用してみscipy.optimize.leastsqました(ドキュメントによると、これはフィッティングが成功したことを意味します)が、ほとんどの場合、最初の推測として入力した値を返します(まったく同じではありませんが、近いです)。それらは真の値に近いか遠いものでした。異なる値を報告する場合でも、結果の曲線は実際の曲線とは大幅に異なります。

別の観察は、infodict['nfev']常に含まれているということです

The relative error between two consecutive iterates is at most 0.000000

シミュレートされたノイズの多いデータを使用している間、両方のパラメーターの真の値が同じ桁であり(使用中のステップサイズが他の方法ではどちらか一方にしか影響しないと考えたため)、桁が大きく異なることを試してみました。 、およびステップサイズ(パラメータepsfcn)を変更しましたが、役に立ちませんでした。

誰かが私が間違っているかもしれないこと、または私が代わりに使用できるフィッティング関数を知っleastsqていますか?もしそうなら:事前にどうもありがとう!

編集

Russが提案したように、シミュレーションの実行方法について詳しく説明します。小さな分子が大きな分子に結合する様子を見ていきます。これは、相互の親和性に依存する確率で発生します(親和性は実験データから抽出される値の1つです)。結合が発生したら、複合体が再び崩壊するまでにかかる時間もシミュレートします(解離時定数は、関心のある2番目のパラメーターです)。他にも多くのパラメータがありますが、それらは予想される信号強度が計算されたときにのみ関連するため、実際のシミュレーションには関連しません。

まず、与えられた数の小分子から始めます。それぞれの状態は、いくつかの時間ステップでシミュレートされます。各タイムステップで、親和性の値を使用して、この分子が結合していない場合に、大きな分子に結合するかどうかを判断します。すでにバインドされている場合は、解離時定数とすでにバインドされている時間を使用して、このステップで解離するかどうかを判断します。

どちらの場合も、パラメーター(親和性、解離時定数)を使用して確率が計算され、乱数(0〜1)と比較されます。この比較では、小分子の状態(bound /アンバウンド)変更。

編集2

結果の曲線の形状を決定する明確に定義された関数はなく、形状は明らかに再現可能ですが、個々のデータポイントにはランダム性の要素があります。したがってoptimize.fminの代わりにをleastsq、収束せず、最大反復回数が実行された後に終了します。

編集3

アンドレアによって提案されたように、私はサンプルプロットをアップロードしました。サンプルデータを提供することが大いに役立つとは思いません。x値(時間)ごとに1つのy値(信号強度)だけです...

4

4 に答える 4

3

データを任意の関数に適合させるには、通常、Levenberg–Marquardtアルゴリズムがscipy.optimize.leastsq必要です。これが使用されるため、正しい関数を使用している可能性があります。

このページのセクション5.4のチュートリアルを見て、それが役立つかどうかを確認してください。

基礎となる関数を適合させるのが難しい可能性もありますが(関数とは何ですか?)、他の問題が発生している可能性があります。

また、StackOverflowと同様に、サンプルコードと詳細をScipy-Userメーリングリストに直接投稿することで、scipyの質問に対するより知識のある回答を得ることができます。

于 2011-09-16T13:23:06.733 に答える
2

グローバルの期待される関数形式がわからないが、システムの現在の状態を考慮して「次の」ポイントの期待値を予測できる場合は、カルマンフィルターの使用を検討できます(ええ、「フィルター」はコンテキストに適合しますが、名前は歴史的であり、現在は簡単に変更できません)。

基礎となる数学は少し怖いように見えるかもしれませんが、この重要な点はあなたがそれを理解する必要がないということです。通常、次のことができる必要があります

  1. 表現スペースを定義する
  2. 表現空間でデータ(シミュレーションまたは実験)を表現します。
  3. 特定の表現から「次の」表現を取得する更新手順を定義します
  4. フィッターから返された一連の表現から目的の曲線を抽出します

これをサポートする既存のPythonパッケージが少なくとも1つあるようです(ここのインターフェースは私が慣れているものとは異なり、それを使用することについて多くのアドバイスを提供することはできません)。

于 2011-09-21T15:07:41.670 に答える
2

正確な答えではありませんが、試すべきPyMinuitもあります。

http://code.google.com/p/pyminuit/

あなたがしたいのは、pdfとデータポイントをchi ^ 2または-ln(尤度)または選択したメトリックに変換し、PyMinuitを使用してそのメトリックを最小化することです。非常に冗長になるように構成できるため、どこで問題が発生したかを確認できます(問題が発生した場合)。

于 2011-09-26T07:36:24.397 に答える
1

パラメータは2つしかないため、グリッド検索を実行する必要があります。

results = {}
for p0 in parameter_space_for_first_parameter:
     for p1 in parameter_space_for_second_parameter:
           results[p0,p1] = compare(p0,p1)

計算に余裕がある場合は、compare(初期化が異なる)複数の実行を実行し、平均と標準偏差を計算する必要があります。あなたは私のパッケージジャグを使ってあなたの計算を管理することを試みることができます(それはまさにこの種のもののために設計されました)。

最後に、結果をプロットし、最小値を確認します(複数ある場合があります)。これは「ばかげた」方法ですが、他の方法が行き詰まる多くの状況で機能します。

これが計算量が多すぎる場合は、2つのパスでこれを行うことができます。粗いグリッドの後に、粗いスペースの最小値の近くにある細かいグリッドが続きます。

于 2011-09-27T02:29:31.593 に答える