2013-05-14 7 views
12

मैं एक कस्टम संभावना घनत्व समारोह के साथ कुछ प्रयोगात्मक मूल्यों के वितरण में फिट करने की कोशिश कर रहा हूं। जाहिर है, परिणामस्वरूप फ़ंक्शन का अभिन्न अंग हमेशा 1 के बराबर होना चाहिए, लेकिन सरल scipy.optimize.curve_fit (फ़ंक्शन, डेटाबिन्सेन्टर्स, डेटा कैउंट्स) के परिणाम कभी भी इस शर्त को पूरा नहीं करते हैं। इस समस्या को हल करने का सबसे अच्छा तरीका क्या है?मैं साइपी वक्र फिट पर बाधा कैसे लगा सकता हूं?

उत्तर

15

आप अपने स्वयं के अवशिष्ट कार्यों को परिभाषित कर सकते हैं, जिसमें दंडित पैरामीटर शामिल है, जैसे नीचे दिए गए कोड में विस्तृत, जहां यह पहले से ज्ञात है कि अंतराल के साथ अभिन्न अंग 2. होना चाहिए। आप दण्डनीय ठहराए जाने के बिना परीक्षण अगर आपको लगता है कि क्या आपके हो रही है पारंपरिक curve_fit है देखेंगे:

enter image description here

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 

संबंधित अन्य प्रश्न:

+0

@ एक्सोन कौन सा चेतावनी? यह अच्छा होगा अगर आप वेब पर कहीं भी अपना कोड पेस्ट कर सकें ... –

+0

मैंने इस विधि की कोशिश की, लेकिन इस मामले में मुझे यह चेतावनी मिलती है: 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

+0

@ एक्सोन यह एक एकीकरण त्रुटि है। मैं यहां जांच कर रहा हूं, लेकिन आप एक और दंडनीय कारक '10000' आज़मा सकते हैं और देखें कि क्या होता है। आप प्रारंभिक अनुमान = (1., 1., 1., 1।) को दूसरे प्रयास में भी बदल सकते हैं –

7

यहाँ है एक लगभग समान स्निपेट जो केवल 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 

enter image description here

0

में आप पहले से संभावना फिटिंग समारोह का अभिन्न गणना करने के लिए तो आप अपने फिट विवश करने के लिए इस जानकारी का उपयोग कर सकते हैं सक्षम हैं, तो। इसका एक बहुत ही सरल उदाहरण डेटा के लिए गॉसियन फिट होगा। एक उसके बाद निम्न तीन पैरामीटर गाऊसी फिट करने के लिए थे, तो यह सामान्य रूप में unnormalised किया जाएगा:

Gaussian

लेकिन, अगर एक के बजाय एक पर सामान्य हालत लागू करता है:

Normalised

तो गॉसियन केवल दो पैरामीटर है और स्वचालित रूप से सामान्यीकृत होता है।

संबंधित मुद्दे