Bagaimana cara menafsirkan matriks kovarians dari kecocokan kurva?


15

Saya tidak terlalu hebat dalam statistik, jadi minta maaf jika ini adalah pertanyaan sederhana. Saya menyesuaikan kurva dengan beberapa data, dan kadang-kadang data saya paling cocok dengan eksponensial negatif dalam bentuk , dan kadang-kadang cocok lebih dekat dengan . Namun, kadang-kadang keduanya gagal, dan saya ingin kembali ke linier. Pertanyaan saya adalah, bagaimana saya bisa menentukan model mana yang cocok dengan data tertentu mengatur yang terbaik dari matriks varians-kovarians yang dihasilkan yang dikembalikan dari fungsi scipy.optimize.curve_fit () ? Saya percaya variansnya ada pada salah satu diagonal matriks ini, tapi saya tidak yakin bagaimana menafsirkannya.Sebuahe(-bx)+cSebuahe(-bx2)+c

PEMBARUAN: Berdasarkan pertanyaan yang serupa , saya berharap bahwa matriks varians-kovarians dapat memberi tahu saya mana di antara tiga model yang paling saya coba cocokkan dengan datanya (saya mencoba mencocokkan banyak set data dengan salah satu dari tiga model ini).

Matriks yang dihasilkan terlihat seperti ini untuk contoh yang diberikan:

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]]

Ini adalah contoh dari apa yang saya lakukan:

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()

Sangat bagus bahwa Anda menautkan ke pertanyaan CV dan, akibatnya, ke utas komentar penting (b / w rolando2, Frank Harrell, ...) mempertanyakan apakah pantas untuk memilih model post facto berdasarkan fit. Mungkin lebih baik menggunakan pengetahuan sebelumnya tentang sistem untuk memilih model.
Aman

Pertanyaan lain tentang CV ini mungkin bermanfaat: stats.stackexchange.com/questions/50830/…
Aman

Mungkinkah ini membantu untuk memahami bagaimana menginterpretasikan stat matriks co-variance .
user4581

Jawaban:


4

Sebagai klarifikasi, variabel pcovdari scipy.optimize.curve_fitadalah kovarian estimasi estimasi parameter, yaitu secara longgar, mengingat data dan model, seberapa banyak informasi yang ada dalam data untuk menentukan nilai parameter dalam model yang diberikan. Jadi itu tidak benar-benar memberi tahu Anda apakah model yang dipilih baik atau tidak. Lihat juga ini .

Masalah apa model yang baik itu memang masalah yang sulit. Seperti yang dikemukakan oleh ahli statistik

Semua model salah, tetapi ada juga yang berguna

Jadi kriteria yang digunakan dalam perbandingan model yang berbeda tergantung pada apa yang ingin Anda capai.

Misalnya, jika Anda menginginkan kurva yang "sedekat mungkin" dengan data, Anda dapat memilih model yang memberikan sisa terkecil . Dalam kasus Anda itu akan menjadi model funcdan parameter estimasi poptyang memiliki nilai terendah saat komputasi

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

Namun, jika Anda memilih model dengan lebih banyak parameter, residual akan secara otomatis berkurang , dengan biaya kompleksitas model yang lebih tinggi. Jadi kemudian kembali ke apa tujuannya dari model.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.