48120


こんにちは。  
今私は実験で得たデータを解析するためにpython,scipyでフィッティングを行い、エラーの値も含めて算出したいと考えています。

元となるデータはxy平面にプロットした点のx,y座標のリスト

[code]

    Epsilon_list = [e1, e2, e3, ... , e14]
    G_list = [g1, g2, g3, ... , g14]
    
[/code]

フィッティングに用いる関数はxを変数、M1,M2を定数として

[code]

    def M_fitfunc(x, M1, M2):
        return (1 - 2*x)**(5/2) * (M1 + M2*x)
    
[/code]

と設定しました。

実際にフィッティングした過程と結果は以下の通りです。M_para_optは最適解、M_covは共分散を示すようです。

[code]

    M_para_opt, M_cov = scipy.optimize.curve_fit(M_fitfunc, Epsilon_list, G_list)
    
    M_para_opt = array([ 133.45631973, -149.65607315])
    M_cov = array([[   5.95002727,   93.90321683],
           [  93.90321683, 1498.93958525]])
    
[/code]

最適解となるM1,M2を求めることには成功したようですが、M1,M2それぞれのエラーの値をどう求めればよいのかわかりません。scipyの公式ドキュメントによると、

[code]

    np.sqrt(np.diag(M_cov))
    
[/code]

つまり、M_covという２行２列のマトリックスの対角成分の平方根がM1,M2それぞれのエラーに相当するようですが、ここでわからない点がいくつかあります。

１．なぜ共分散がエラーの値として正しいのか  
２．そもそも共分散(M_cov)が行列として表現されるのはなぜか  
３．一般的に分散の平方根＝標準偏差だが、この行列の中の対角成分が共分散だとして、非対角成分は何を表しているのか

以上３点について、教えていただきたいと思います。よろしくお願いします。


CC BY-SA 4.0
2018-09-05T06:02:16.167
48105
2018-09-05T13:18:42.457
2018-09-05T06:48:58.520
3060
29987
question
python python3 scipy
scipy.optimizeにおけるエラーの算出について


一般に共分散は(非対角成分が等しい対称)行列として表現できます。  
共分散を考えるということは沢山ある確率変数のうち、2変数を抜き出してその2つの確率変数間の相関とばらつきを考えることであり、それを列挙するための表現として行列は適切でしょう。(2の答え)  
wikipedia - 分散共分散行列  
<https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E5%85%B1%E5%88%86%E6%95%A3%E8%A1%8C%E5%88%97>  
例えば確率変数x,yに対しては2×2の共分散行列が形成されます。  
xとyの共分散をCov(x,y)と表現するとscipyが返す2×2行列は  
[[Cov(M1,M1), Cov(M1,M2)]  
[Cov(M2,M1), Cov(M2,M2)]]  
ここでM1同士の共分散Cov(M1,M1)は変数M1の分散を表します。  
対角成分は結局のところM1とM2のそれぞれの **分散**
になります。その平方根はそれぞれのパラメータの標準偏差です。エラーの定義にもよりますが、標準偏差はエラーの値として妥当ではないでしょうか？(1の答え)  
非対角成分はM1とM2の **共分散**
を表します。ここでCov(M1,M2)とCov(M2,M1)は当然等しいので、共分散行列は必ず対称行列になります。(3の答え)


CC BY-SA 4.0
2018-09-05T13:18:42.457
48120
2018-09-05T13:18:42.457
25980
48105
answer