मैं एक कस्टम संभावना घनत्व समारोह के साथ कुछ प्रयोगात्मक मूल्यों के वितरण में फिट करने की कोशिश कर रहा हूं। जाहिर है, परिणामस्वरूप फ़ंक्शन का अभिन्न अंग हमेशा 1 के बराबर होना चाहिए, लेकिन सरल scipy.optimize.curve_fit (फ़ंक्शन, डेटाबिन्सेन्टर्स, डेटा कैउंट्स) के परिणाम कभी भी इस शर्त को पूरा नहीं करते हैं। इस समस्या को हल करने का सबसे अच्छा तरीका क्या है?मैं साइपी वक्र फिट पर बाधा कैसे लगा सकता हूं?
उत्तर
आप अपने स्वयं के अवशिष्ट कार्यों को परिभाषित कर सकते हैं, जिसमें दंडित पैरामीटर शामिल है, जैसे नीचे दिए गए कोड में विस्तृत, जहां यह पहले से ज्ञात है कि अंतराल के साथ अभिन्न अंग 2.
होना चाहिए। आप दण्डनीय ठहराए जाने के बिना परीक्षण अगर आपको लगता है कि क्या आपके हो रही है पारंपरिक curve_fit
है देखेंगे:
import matplotlib.pyplot as plt
import scipy
from scipy.optimize import curve_fit, minimize, leastsq
from scipy.integrate import quad
from scipy import pi, sin
x = scipy.linspace(0, pi, 100)
y = scipy.sin(x) + (0. + scipy.rand(len(x))*0.4)
def func1(x, a0, a1, a2, a3):
return a0 + a1*x + a2*x**2 + a3*x**3
# here you include the penalization factor
def residuals(p,x,y):
integral = quad(func1, 0, pi, args=(p[0],p[1],p[2],p[3]))[0]
penalization = abs(2.-integral)*10000
return y - func1(x, p[0],p[1],p[2],p[3]) - penalization
popt1, pcov1 = curve_fit(func1, x, y)
popt2, pcov2 = leastsq(func=residuals, x0=(1.,1.,1.,1.), args=(x,y))
y_fit1 = func1(x, *popt1)
y_fit2 = func1(x, *popt2)
plt.scatter(x,y, marker='.')
plt.plot(x,y_fit1, color='g', label='curve_fit')
plt.plot(x,y_fit2, color='y', label='constrained')
plt.legend(); plt.xlim(-0.1,3.5); plt.ylim(0,1.4)
print 'Exact integral:',quad(sin ,0,pi)[0]
print 'Approx integral1:',quad(func1,0,pi,args=(popt1[0],popt1[1],
popt1[2],popt1[3]))[0]
print 'Approx integral2:',quad(func1,0,pi,args=(popt2[0],popt2[1],
popt2[2],popt2[3]))[0]
plt.show()
#Exact integral: 2.0
#Approx integral1: 2.60068579748
#Approx integral2: 2.00001911981
संबंधित अन्य प्रश्न:
यहाँ है एक लगभग समान स्निपेट जो केवल curve_fit
का उपयोग करता है।
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as opt
import scipy.integrate as integr
x = np.linspace(0, np.pi, 100)
y = np.sin(x) + (0. + np.random.rand(len(x))*0.4)
def Func(x, a0, a1, a2, a3):
return a0 + a1*x + a2*x**2 + a3*x**3
# modified function definition with Penalization
def FuncPen(x, a0, a1, a2, a3):
integral = integr.quad(Func, 0, np.pi, args=(a0,a1,a2,a3))[0]
penalization = abs(2.-integral)*10000
return a0 + a1*x + a2*x**2 + a3*x**3 + penalization
popt1, pcov1 = opt.curve_fit(Func, x, y)
popt2, pcov2 = opt.curve_fit(FuncPen, x, y)
y_fit1 = Func(x, *popt1)
y_fit2 = Func(x, *popt2)
plt.scatter(x,y, marker='.')
plt.plot(x,y_fit2, color='y', label='constrained')
plt.plot(x,y_fit1, color='g', label='curve_fit')
plt.legend(); plt.xlim(-0.1,3.5); plt.ylim(0,1.4)
print 'Exact integral:',integr.quad(np.sin ,0,np.pi)[0]
print 'Approx integral1:',integr.quad(Func,0,np.pi,args=(popt1[0],popt1[1],
popt1[2],popt1[3]))[0]
print 'Approx integral2:',integr.quad(Func,0,np.pi,args=(popt2[0],popt2[1],
popt2[2],popt2[3]))[0]
plt.show()
#Exact integral: 2.0
#Approx integral1: 2.66485028754
#Approx integral2: 2.00002116217
में आप पहले से संभावना फिटिंग समारोह का अभिन्न गणना करने के लिए तो आप अपने फिट विवश करने के लिए इस जानकारी का उपयोग कर सकते हैं सक्षम हैं, तो। इसका एक बहुत ही सरल उदाहरण डेटा के लिए गॉसियन फिट होगा। एक उसके बाद निम्न तीन पैरामीटर गाऊसी फिट करने के लिए थे, तो यह सामान्य रूप में unnormalised किया जाएगा:
लेकिन, अगर एक के बजाय एक पर सामान्य हालत लागू करता है:
तो गॉसियन केवल दो पैरामीटर है और स्वचालित रूप से सामान्यीकृत होता है।
- 1. SciPy वैश्विक न्यूनतम वक्र फिट
- 2. मैं अजगर में एक गाऊसी वक्र कैसे फिट कर सकता हूं?
- 3. मैं स्क्रीन पर रिलेवेटलाइट कैसे फिट कर सकता हूं?
- 4. मैं टेबल पर डिलीट बाधा कैसे जोड़ सकता हूं?
- 5. मैं System.Web.HttpPostedFileBase से System.Web.HttpPostedFile पर कैसे लगा सकता हूं?
- 6. मैं नेटवर्क पर आईफोन का पता कैसे लगा सकता हूं?
- 7. मैं OrbitControl पर सीमा कैसे लगा सकता हूं - Three.js
- 8. साइपी
- 9. साइपी
- 10. ggplot जीएलएम बातचीत के बिना फिट वक्र
- 11. साइपी
- 12. एंड्रॉइड 2.2 - मैं कैसे पता लगा सकता हूं कि मैं एसडीकार्ड पर स्थापित हूं या नहीं?
- 13. जब मैं एकता चलाने वाली प्रणाली पर हूं तो मैं कैसे पता लगा सकता हूं?
- 14. मैं विंडोज़ में डिस्प्ले डिटेक्शन कैसे लगा सकता हूं?
- 15. मैं कैसे पता लगा सकता हूं कि मेरा पृष्ठ पोस्टबैक
- 16. मैं स्मार्टगिट में एक पंक्ति कैसे लगा सकता हूं?
- 17. मैं फ़ाइल के एन्कोडिंग का पता कैसे लगा सकता हूं?
- 18. मैं कैसे पता लगा सकता हूं कि जेनकिंस
- 19. आईफोन - मैं आईफोन संस्करण का पता कैसे लगा सकता हूं?
- 20. मैं पिछले संशोधन में पैच कैसे लगा सकता हूं?
- 21. मैं एएसपी .NET संकलन प्रक्रिया कैसे लगा सकता हूं?
- 22. मैं सेवा विज्ञापन आयामों का पता कैसे लगा सकता हूं
- 23. मैं सी में पैलिंड्रोम का पता कैसे लगा सकता हूं?
- 24. मैं Google स्प्रेडशीट आईडी का पता कैसे लगा सकता हूं?
- 25. मैं चेकसम एल्गोरिदम का अनुमान कैसे लगा सकता हूं?
- 26. मैं कैसे पता लगा सकता हूं कि वीबी.Net DataRow
- 27. मैं हिब्रू में पालिंड्रोम का पता कैसे लगा सकता हूं?
- 28. छवियों में मैं कैसे पता लगा सकता हूं (और सही)?
- 29. डब्ल्यूसीएफ: मैं संदेश निकायों का पता कैसे लगा सकता हूं?
- 30. मैं चेकसम एल्गोरिदम का अनुमान कैसे लगा सकता हूं?
@ एक्सोन कौन सा चेतावनी? यह अच्छा होगा अगर आप वेब पर कहीं भी अपना कोड पेस्ट कर सकें ... –
मैंने इस विधि की कोशिश की, लेकिन इस मामले में मुझे यह चेतावनी मिलती है: http://dpaste.org/NfLwy/, और परिणामी फिट वक्र ' टी लगभग वितरण के समान ही है। [scipy.optimize.curve_fit] (http://storage8.static.itmages.ru/i/13/0520/h_1369043990_1772962_4ff4c2e582.png) [दंड के साथ] (http://storage1.static.itmages.ru/ i/13/0520/h_1369044034_5072385_fce21d00cc.png) – Axon
@ एक्सोन यह एक एकीकरण त्रुटि है। मैं यहां जांच कर रहा हूं, लेकिन आप एक और दंडनीय कारक '10000' आज़मा सकते हैं और देखें कि क्या होता है। आप प्रारंभिक अनुमान = (1., 1., 1., 1।) को दूसरे प्रयास में भी बदल सकते हैं –