曲線近似から共分散行列を解釈するにはどうすればよいですか?


15

私は統計があまり得意ではないので、これが単純な質問であればおifびします。一部のデータに曲線を当てはめていますが、データがの形の負の指数関数に最適な場合があり、a e b x 2)に近い場合があります+ C。ただし、これらの両方が失敗する場合があり、線形フィットにフォールバックしたいと思います。私の質問は、どのモデルが特定のデータセットに最も適合するかを、結果の分散共分散行列から最適に決定する方法です。aebバツ+caebバツ2+cscipy.optimize.curve_fit()関数?分散はこの行列の対角線の1つにあると思いますが、どのように解釈するのかわかりません。

更新:同様の質問に基づいて、分散共分散行列が、3つのモデルのうちどれがデータに最も適合するかを教えてくれることを期待しています(これら3つのモデルの1つに多くのデータセットを適合させようとしています)。

結果の行列は、指定された例では次のようになります。

pcov_lin 
[[  2.02186921e-05  -2.02186920e-04]
 [ -2.02186920e-04   2.76322124e-03]]
pcov_exp
[[  9.05390292e+00  -7.76201283e-02  -9.20475334e+00]
 [ -7.76201283e-02   6.69727245e-04   7.90218415e-02]
 [ -9.20475334e+00   7.90218415e-02   9.36160310e+00]]
pcov_exp_2 
[[  1.38338049e-03  -7.39204594e-07  -7.81208814e-04]
 [ -7.39204594e-07   8.99295434e-09   1.92970700e-06]
 [ -7.81208814e-04   1.92970700e-06   9.14746758e-04]]

ここに私がやっていることの例があります:

import numpy as np
import matplotlib.pyplot as plt
import scipy as sp
import scipy.optimize

def exp_func(x, a, b, c):
    return a * np.exp(-b * x) + c

def exp_squared_func(x, a, b, c):
    return a * np.exp(-b * x*x*x) + c

def linear_func(x, a, b):
    return a*x + b

def main():
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], np.float)
    y = np.array([1, 1, 1, 1, 0.805621, 0.798992, 0.84231, 0.728796, 0.819471, 0.570414, 0.355124, 0.276447, 0.159058, 0.0762189, 0.0167807, 0.0118647, 0.000319948, 0.00118267, 0, 0, 0], np.float)

    p0 = [0.7746042467213462, 0.10347274384077858, -0.016253458007293588]
    popt_lin, pcov_lin      = scipy.optimize.curve_fit(linear_func, x, y)
    popt_exp, pcov_exp      = scipy.optimize.curve_fit(exp_func, x, y)
    popt_exp_2, pcov_exp_2  = scipy.optimize.curve_fit(exp_squared_func, x, y)

    plt.figure()
    plt.plot(x, y, 'ko', label="Original data")
    plt.plot(x, linear_func(x, *popt_lin), 'r-', label='linear')
    plt.plot(x, exp_func(x, *popt_exp), 'b-', label='exponential')
    plt.plot(x, exp_squared_func(x, *popt_exp_2), 'g-', label='exponential squared')
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

そのCV質問にリンクし、その結果、適合に基づいて事後モデルを選択することが適切かどうかを質問する重要なコメントスレッド(b / w rolando2、Frank Harrell、...)にリンクすることは素晴らしいことです。おそらく、システムの事前知識を使用してモデルを選択する方が良いでしょう。
アマン

CVのこの他の質問役に立つかもしれません:stats.stackexchange.com/questions/50830/...
アマン

これは、共分散行列の解釈方法を理解するのに役立ちますstats.stackexchange.com/questions/10795/…-3 番目のモデルの値は小さく、偏差が少ないことを示しています。
user4581

回答:


4

明確化として、変数pcovfrom scipy.optimize.curve_fitはパラメーター推定値の推定共分散です。つまり、データモデルが与えられた場合そのモデルのパラメーターの値を決定するためにデータに含まれる情報の量です。そのため、選択したモデルが良いかどうかはわかりません。参照してくださいこれを

良いモデルであるという問題は確かに難しい問題です。統計学者が主張したように

すべてのモデルが間違っていますが、いくつかは便利です

そのため、異なるモデルの比較で使用する基準は、何を達成したいかによって異なります。

たとえば、データに「できるだけ近い」曲線が必要な場合、最小の残差を与えるモデルを選択できます。あなたの場合、それは計算時に最も低い値を持つモデルfuncと推定パラメータになりますpopt

numpy.linalg.norm(y-func(x, *popt))

ただし、より多くのパラメーターを持つモデルを選択すると、モデルの複雑さが増しますが、残差は自動的に減少します。そのため、モデルの目標が何であるかに戻ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.