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.
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()
sumber
Jawaban:
Sebagai klarifikasi, variabel
pcov
dariscipy.optimize.curve_fit
adalah 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
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
func
dan parameter estimasipopt
yang memiliki nilai terendah saat komputasiNamun, 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.
sumber