2

ベストフィット線形パラメータAとB(y = Ax + b)は、これらのパラメータに対するカイ2乗関数の最小値に対応します。グローバルカイ二乗最小値(2パラメータ線形カイ2乗が放物線であるため保証)をブルートフォースグリッドで検索し、3つのネストされたループ(以下)で実現しましたが、ループを避けたい(ベクトル化Numpyの配列放送プロパティを使用して)。PythonでのLooplessカイ二乗グリッド検索numpy

カイ二乗(加重最小二乗)は次のように定義される。

以下
Chi-square(k,j) = sum (y[i]-(A[k]*x[i]+B[j]))/yerr[i])^2 

10,000 Aの組み合わせ及びBパラメータ値上カイ二乗値で100×100のグリッドを埋めるのPython numpyのコードであります(それぞれ100個の値)。 x、y、yerrという3つのデータ配列があります。

Python Numpyでの2パラメータ線形カイ二乗グリッド検索の無用バージョンへの助けに感謝します。

注意グリッド検索を行い、scipy.optimize.minimizeを使用しない - ありがとう!

キース

# create parameter grid 
a = np.linspace(80,120,100) 
b = np.linspace(10,40,100) 
A,B = np.meshgrid(a,b) 

# calculate chi-square over parameter grid 
chi2=np.zeros((100,100)) 

for k in range(100): 
    for j in range(100): 
     for i in range (len(y)): 
      chi2a = ((y[i]-a[k]*x[i]-b[j])/yerr[i])**2; 
      chi2[k,j]+=chi2a; 
+1

最後の行のインデントが間違って見える -

subs = (y-a[:,None,None]*x-b[:,None])/yerr chi2 = (subs**2).sum(2) 

はここnp.einsumとの相互だと多分速いです。また、代わりに 'chi2 [k、j] + = chi2a'ではないでしょうか? – Divakar

+0

両方のコメントに「はい」(編集済み)です。これをキャッチしていただきありがとうございます! – Carey

+0

'chi2a'の計算ごとに更新を合計する必要があるので、そこにさらに2つのタブインデントが必要であると考えてください。 – Divakar

答えて

3

ここNumPy broadcastingを利用して1つのベクトル化されたアプローチだ -

chi2 = np.einsum('ijk,ijk->ij',subs,subs) #subs from previous one 
+0

美しく簡潔な配列プログラミング - ありがとう! – Carey

関連する問題