मैं आँकड़ों के मामले में बहुत महान नहीं हूँ, इसलिए अगर यह एक सरलीकृत प्रश्न है तो माफी माँगता हूँ। मैं कुछ आंकड़ों के रूप में एक नकारात्मक घातीय एक वक्र ढाले रहा हूँ, और कभी कभी मेरे डेटा सबसे अच्छा फिट , और कभी कभी फिट के करीब है एक * ई ( - ख * एक्स 2 ) + सी । हालांकि, कभी-कभी वे दोनों असफल हो जाते हैं, और मैं एक रैखिक फिट पर वापस गिरना चाहूंगा। मेरा सवाल यह है कि, मैं यह कैसे निर्धारित कर सकता हूं कि कौन सा मॉडल किसी विशेष डेटा को सेट करता है जिसके परिणामस्वरूप विचरण-कोविर्सियस मैट्रिक्स से सबसे अच्छा सेट किया गया है जो कि वापस आ गया हैscipy.optimize.curve_fit () फ़ंक्शन? मेरा मानना है कि विचरण इस मैट्रिक्स के विकर्णों में से एक पर है, लेकिन मुझे यकीन नहीं है कि इसकी व्याख्या कैसे करें।
अद्यतन: एक समान प्रश्न के आधार पर , मैं उम्मीद कर रहा हूं कि विचरण-सहसंयोजक मैट्रिक्स मुझे बता सकता है कि मैं उन तीन मॉडलों में से कौन सा डेटा फिट करने का प्रयास कर रहा हूं (मैं इन तीन मॉडलों में से एक के लिए कई डेटासेट फिट करने की कोशिश कर रहा हूं)।
दिए गए उदाहरण के लिए परिणामी मैट्रिक्स इस तरह दिखते हैं:
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()