フォームの実験データとフォーム(X,Y)
の理論モデルがあり、(x(t;*params),y(t;*params))
はt
物理的 (ただし観測不可能) 変数であり、*params
決定したいパラメーターです。は連続変数であり、モデル内のとと の間に と の間t
に 1:1 の関係があります。x
t
y
t
完璧な世界では、(パラメーターの実際の値) の値を知ってT
いて、非常に基本的な最小二乗法を実行して の値を見つけることができます*params
。( 31243002や31464345のように、プロット内のとの値を「接続」しようとしているわけではないことに注意してください。)データは複数のサイクルにわたって収集されるため、実際のデータでは潜在値が単調であることを保証できません。x
y
T
私はカーブ フィッティングを手動で行った経験があまりなく、基本的な scipy 関数に簡単にアクセスできない非常に粗雑な方法を使用する必要があります。私の基本的なアプローチは次のとおりです。
- の値を選択
*params
してモデルに適用する - 値の配列を取り、
t
それをモデルに入れて、次の配列を作成します。model(*params) = (x(*params),y(*params))
X
(データ値)を補間しmodel
て取得しますY_predicted
Y
との間の最小二乗 (またはその他の) 比較を実行します。Y_predicted
- 新しいセットのためにもう一度やり直してください
*params
- 最終的に、最適な値を選択します
*params
このアプローチにはいくつかの明らかな問題があります。
1) 私は、「ソリューション空間ですべてを試す」以外の非常に優れた「やり直す」、おそらく「粗いグリッドですべてを試す」、「少しの間すべてをもう一度試す」を開発するためのコーディングの経験が十分ではありません。粗いグリッドのホットスポットにあるより細かいグリッド。」MCMC法をやってみましたが、主に問題2が原因で、最適な値が見つかりませんでした
2) ステップ 2 ~ 4 は、それ自体が非常に非効率的です。
私は次のようなことを試しました(疑似コードに似ています。実際の機能は構成されています)。A、B でブロードキャストを使用することについては、多くの小さな問題がありますが、それらは、すべてのステップで補間する必要があるという問題ほど重要ではありません。
私が知っている人は、ある種の期待値最大化アルゴリズムを使用することを推奨していますが、ゼロからコードを作成するのに十分な知識はありません。問題全体をカバーする素晴らしい scipy (またはオープンソース) アルゴリズムが見つからないことを本当に望んでいますが、現時点では期待できません。
import numpy as np
import scipy as sci
from scipy import interpolate
X_data
Y_data
def x(t,A,B):
return A**t + B**t
def y(t,A,B):
return A*t + B
def interp(A,B):
ts = np.arange(-10,10,0.1)
xs = x(ts,A,B)
ys = y(ts,A,B)
f = interpolate.interp1d(xs,ys)
return f
N = 101
lsqs = np.recarray((N**2),dtype=float)
count = 0
for i in range(0,N):
A = 0.1*i #checks A between 0 and 10
for j in range(0,N):
B = 10 + 0.1*j #checks B between 10 and 20
f = interp(A,B)
y_fit = f(X_data)
squares = np.sum((y_fit - Y_data)**2)
lsqs[count] = (A,b,squares) #puts the values in place for comparison later
count += 1 #allows us to move to the next cell
i = np.argmin(lsqs[:,2])
A_optimal = lsqs[i][0]
B_optimal = lsqs[i][1]