2012-02-21 13 views
12

scipy lib में leastsq विधि कुछ डेटा के लिए एक वक्र फिट बैठता है। और इस विधि का तात्पर्य है कि इस डेटा में वाई मान कुछ एक्स तर्क पर निर्भर करता है। और वक्र और वाई अक्ष (डीवाई) में डेटा बिंदुकम से कम वर्ग विधि में ऑर्थोगोनल रिग्रेशन फिटिंग

लेकिन क्या होगा अगर मैं दोनों अक्ष में कम से कम दूरी (डीवाई और dx)

की गणना करनी बीच की न्यूनतम दूरी की गणना करता है वहाँ यह लागू करने के कुछ तरीके है गणना?

यहाँ कोड का एक नमूना है जब एक धुरी गणना का उपयोग कर रहा है:

import numpy as np 
from scipy.optimize import leastsq 

xData = [some data...] 
yData = [some data...] 

def mFunc(p, x, y): 
    return y - (p[0]*x**p[1]) # is takes into account only y axis 

plsq, pcov = leastsq(mFunc, [1,1], args=(xData,yData)) 
print plsq 

मैं हाल ही में scipy.odr पुस्तकालय tryed और यह केवल रेखीय कार्य के लिए उचित परिणाम देता है। Y = a * x^b जैसे अन्य कार्यों के लिए यह गलत परिणाम देता है। यह मैं इसे कैसे उपयोग करते हैं:

def f(p, x):  
    return p[0]*x**p[1] 

myModel = Model(f) 
myData = Data(xData, yData) 
myOdr = ODR(myData, myModel , beta0=[1,1]) 
myOdr.set_job(fit_type=0) #if set fit_type=2, returns the same as leastsq 
out = myOdr.run() 
out.pprint() 

यह गलत परिणाम, नहीं वांछित देता है, और कुछ इनपुट डेटा भी असली के करीब नहीं है। हो सकता है, इसका उपयोग करने के कुछ विशेष तरीके हैं, मैं गलत क्या करूँ?

+1

SciPy "ओर्थोगोनल दूरी प्रतिगमन" के लिए एक मॉड्यूल है करने के लिए मुझे निर्देश दिया - कि तुम क्या जरूरत है? http://docs.scipy.org/doc/scipy/reference/odr.html –

+0

हां, ऐसा लगता है कि यह समस्या हल हो रही है, लेकिन जब मैं इसे आज़माता हूं, तो यह leastsq विधि के समान परिणाम देता है। मैंने उदाहरणों का पालन किया, जो दस्तावेज़ीकरण में दिए गए हैं, और यह आवश्यकतानुसार काम नहीं करता है। क्या आपके पास कुछ कामकाजी उदाहरण हैं? – Vladimir

+0

जब मैंने कोशिश की तो मैंने पाया कि परिणाम समान थे, लेकिन समान नहीं - मुझे लगता है कि इसका मतलब है कि अतिरिक्त गणना फिट में बहुत अंतर नहीं करती है। –

उत्तर

5

मैं समाधान मिल गया है। Scipy Odrpack noramally काम करता है लेकिन इसे सही परिणामों के लिए एक अच्छा प्रारंभिक अनुमान की जरूरत है। इसलिए मैंने प्रक्रिया को दो चरणों में विभाजित कर दिया।

पहला चरण: कम से कम वर्ग विधि का उपयोग करके प्रारंभिक अनुमान पाएं।

दूसरा चरण: बीडीए पैरामीटर के रूप में ओडीआर में इन प्रारंभिक अनुमानों को प्रतिस्थापित करें।

और यह एक स्वीकार्य गति के साथ बहुत अच्छी तरह से काम करता है।

तुम लोग धन्यवाद, आपकी सलाह सही समाधान

+1

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन क्या आप संभवतः यहां अपना कोड स्निपेट पोस्ट कर सकते हैं। मैं एक अंतर्निहित ओडीआर करने की कोशिश कर रहा हूं लेकिन मुझे यकीन नहीं है कि इसे कैसे स्थापित किया जाए। – Barbarossa

+1

@ बरबरोसा आपको [यह कोड स्निपेट] पसंद हो सकता है (http://blog.rtwilson.com/orthogonal-distance-regression-in-python/)। – gerrit

+0

@gerrit जानकारी के लिए धन्यवाद। – Barbarossa

0

यदि आप पी द्वारा वर्णित फ़ंक्शन को उलटा करने में सक्षम होते हैं तो आप केवल एम-पिनवर्टेड (वाई) में एमएफएनसीसी में शामिल हो सकते हैं, मुझे लगता है कि एसक्यूआरटी (ए^2 + बी^2), इसलिए (छद्म कोड)

return sqrt((y - (p[0]*x**p[1]))^2 + (x - (pinverted(y))^2) 
उदाहरण के लिए

y=kx+m p=[m,k]  
pinv=[-m/k,1/k] 

return sqrt((y - (p[0]+x*p[1]))^2 + (x - (pinv[0]+y*pinv[1]))^2) 

के लिए

लेकिन क्या आप के लिए पूछ कुछ मामलों में समस्याग्रस्त है। उदाहरण के लिए, यदि एक बहुपद (या आपके x^j) वक्र में y (m) पर न्यूनतम ym है और आपके पास एक बिंदु x है, y y से कम है, तो आप किस प्रकार का मूल्य वापस करना चाहते हैं? हमेशा एक समाधान नहीं है।

+0

यदि बिंदु x, y ym से कम है तो उसे उस ym तक मार्मिक दूरी वापस करनी चाहिए। ** वर्ग ((एम-एक्स)^2 + (वाईएम-वाई)^2)/2 **। यह एक समस्या क्यों है? – Vladimir

+0

यदि आपके पास कोई फ़ंक्शन y = f (x) है जिसका अर्थ है कि किसी भी x के लिए y के लिए कोई मान है। बॉट किसी भी इनपुट वाई के लिए हमेशा x का मान नहीं है। सभी कार्य उलटा नहीं हैं। उदाहरण के लिए y = x^2 और x = -2 –

+0

ओह के साथ कोई भी बिंदु, अब मैं देखता हूं, हाँ आप सही हैं। लेकिन कुछ सॉफ्टवेयर किसी भी इनपुट डेटा पर किसी भी फ़ंक्शन के लिए इस कम से कम वर्ग (डेमिंग रिग्रेशन) को फ़िट करने के लिए कैसे बनाते हैं। पाइथन – Vladimir

6

scipy.odr ऑर्थोगोनल दूरस्थ रिग्रेशन लागू करता है। docstring में बुनियादी उपयोग के लिए निर्देश देखें:

https://github.com/scipy/scipy/blob/master/scipy/odr/odrpack.py#L27

+0

ओह, हाँ, मैंने कोशिश की, और यह leastsq के समान काम करता है, वही परिणाम देता है – Vladimir

+4

सटीक परिणाम क्या हैं? मुझे लगता है कि असंभव है। क्या आप अपनी पोस्ट को 'scipy.odr'' के साथ एक रननेबल उदाहरण दिखाने के लिए अपडेट कर सकते हैं जो आपको गलत परिणाम देता है? –

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