2009-08-31 24 views
10

मैं एक गैर-रैखिक वक्र फिटिंग दिनचर्या (शायद आर या पायथन में पाया जाने वाला सबसे अधिक संभावना है, लेकिन मैं अन्य भाषाओं के लिए खुला हूं) जो x, y डेटा और इसे एक वक्र फिट करें।डेटा से मिलान करने के लिए वक्र ढूंढना

मुझे एक स्ट्रिंग के रूप में निर्दिष्ट अभिव्यक्ति के प्रकार को निर्दिष्ट करने में सक्षम होना चाहिए जिसे मैं फिट करना चाहता हूं।

उदाहरण:

"A+B*x+C*x*x" 
"(A+B*x+C*x*x)/(D*x+E*x*x)" 
"sin(A+B*x)*exp(C+D*x)+E+F*x" 

क्या मैं इस से बाहर निकलना होगा कि कम से कम स्थिरांक के लिए मूल्यों (ए, बी, सी, आदि) और उम्मीद है कि आँकड़े मैच की फिटनेस के बारे में है।

ऐसा करने के लिए वाणिज्यिक कार्यक्रम हैं, लेकिन मुझे आजकल भाषा लाइब्रेरी में वांछित अभिव्यक्ति के लिए उपयुक्त के रूप में कुछ सामान्य खोजने में सक्षम होने की उम्मीद है। मुझे संदेह है कि SciPy की ऑप्टिमाइज़ेशन सामग्री ऐसा करने में सक्षम हो सकती है, लेकिन मैं नहीं देख सकता कि यह मुझे समीकरण को परिभाषित करने देता है। इसी प्रकार, मुझे लगता है कि मैं आर

में जो कुछ भी ढूंढ रहा हूं, उसे ढूंढने के लिए मुझे लगता है, या मुझे अपना खुद का रोल करने की आवश्यकता है? अगर ऐसा होता है तो मुझे ऐसा करने से नफरत है और मुझे बस इसे ढूंढने में परेशानी हो रही है।


संपादित करें: मैं इस प्रक्रिया की तुलना में मैं प्रयोगशाला फिट से प्राप्त सामग्री पर और अधिक नियंत्रण के लिए ऐसा करना चाहते हैं। एलएबी फ़िट यूआई डरावना है। मैं रेंज को कई टुकड़ों में तोड़ने में सक्षम होना चाहूंगा और अलग-अलग वक्र रेंज के विभिन्न टुकड़ों का प्रतिनिधित्व करेंगे। अंत में, परिणाम रैखिक इंटरपोलेशन के साथ एक LUT को हरा (गति-वार) करने में सक्षम होना चाहिए या मुझे कोई दिलचस्पी नहीं है।

मेरी वर्तमान समस्याओं के सेट में, मेरे पास ट्रिग फ़ंक्शंस या एक्सप() है और मुझे वास्तविक समय में प्रति सेकंड 352,800 बार निष्पादित करने की आवश्यकता है (और केवल CPU का केवल एक अंश उपयोग करें)। इसलिए मैं वक्र को साजिश करता हूं और कम महंगा अनुमान प्राप्त करने के लिए वक्र फिटर को चलाने के लिए डेटा का उपयोग करता हूं। पुराने दिनों में, एलयूटी लगभग हमेशा समाधान थे, लेकिन आजकल मेमोरी लुकअप को छोड़कर और अनुमान लगाना कभी-कभी तेज़ होता है।

+0

आपको पता है कि यह एक बहुत बुरा विचार है, सांख्यिकीय बोल? यदि आप बस अपने डेटा के लिए एक लचीला फिट चाहते हैं, तो लचीला मॉडल, जैसे स्वाद, स्प्लिंस, या सामान्यीकृत योजक मॉडल का उपयोग करें। – hadley

+0

यहां तक ​​कि सीमाओं को छोटी श्रेणियों में तोड़ना भी एक लागत है जिसके साथ मुझे सावधान रहना होगा। मेरे पास ऑडियो डेटा के लिए सभी प्रकार के महान इंटरपोलेटर तक पहुंच है, लेकिन वे आम तौर पर मेरे लिए बहुत संगणकीय रूप से गहन हैं। आम तौर पर, एक बार मुझे टुकड़ों में रेंज तोड़ना शुरू करना पड़ता है, मैं एक लूट के साथ बेहतर हूं। डीएसपी अनुप्रयोगों में वक्र के अनुमान अभी भी बहुत उपयोगी हैं। – Nosredna

उत्तर

8

आपके प्रश्न का उत्तर सामान्य ज्ञान (आर में पैरामीटर अनुमान के संबंध में) के समीकरणों के विनिर्देशों पर विचार किए बिना, मुझे लगता है कि आप एनएलएस() या ऑप्टिमाइज़() की तलाश में हैं ...'एनएलएस' मेरी पहली पसंद है क्योंकि यह प्रत्येक अनुमानित पैरामीटर के लिए त्रुटि अनुमान प्रदान करता है और जब यह विफल रहता है तो मैं 'ऑप्टिमाइज़' का उपयोग करता हूं। आप अपने एक्स, वाई चर है: गुणांक

out <- tryCatch(nls(y ~ A+B*x+C*x*x, data = data.frame(x,y), 
       start = c(A=0,B=1,C=1)) , 
       error=function(e) 
       optim(c(A=0,B=1,C=1), function(p,x,y) 
         sum((y-with(as.list(p),A + B*x + C*x^2))^2), x=x, y=y)) 

प्राप्त करने के लिए,

getcoef <- function(x) if(class(x)=="nls") coef(x) else x$par 
getcoef(out) 

आप 'NLS' के मामले में मानक त्रुटियों चाहते हैं की तरह कुछ,

summary(out)$parameters 

सहायता फाइलें और आर-सहायता मेलिंग सूची पोस्ट में प्रत्येक द्वारा लागू विशिष्ट न्यूनतमकरण एल्गोरिदम के संबंध में कई चर्चाएं होती हैं (ऊपर दिए गए प्रत्येक उदाहरण मामले में डिफ़ॉल्ट रूप से उपयोग की जाती है) और विशिष्ट एफ के लिए उनकी उपयुक्तता हाथ में समीकरण का ओआरएम। कुछ एल्गोरिदम बॉक्स बाधाओं को संभाल सकते हैं, और constrOptim() नामक एक अन्य फ़ंक्शन रैखिक बाधाओं का एक सेट संभाल लेगा। इस वेबसाइट भी मदद मिल सकती:

http://cran.r-project.org/web/views/Optimization.html

+0

क्या मैं सूत्र के रूप में सूत्र को खिला सकता हूं? – Nosredna

+1

हाँ - जैसे कुछ .formula (पेस्ट ("वाई", "ए + बी * एक्स + सी * एक्स^2", सीपी = "~")) इसे करना चाहिए। – hatmatrix

+0

जो एनएलएस मामले में था, ऑप्टिकल जैसे कुछ (पैरा = टेक्स्ट = स्पिंटफ ("योग ((वाई-% एस)^2)", "ए + बी * एक्स + सी * एक्स^2")) काम करना चाहिए (स्प्रिंटफ निर्माण दिखाया गया है ताकि आप जो फॉर्मूला चाहते हैं उसे सम्मिलित कर सकें)। – hatmatrix

1

GNU Octave देखें - इसके पॉलीफिट() और nonlinear बाधाओं के बीच हल करने के लिए यह आपकी समस्या के लिए उपयुक्त कुछ बनाना संभव होना चाहिए।

+0

मैं वास्तव में कभी-कभी ऑक्टेव का उपयोग करता हूं। मैं देखता हूं कि मैं क्या समझ सकता हूं। – Nosredna

8

आपका पहला मॉडल वास्तव में रैखिक तीन मापदंडों में है और

fit <- lm(y ~ x + I(x^2), data=X) 

का उपयोग कर अनुसंधान में फिट किया जा सकता है जो आप अपने तीन मापदंडों मिल जाएगा। नहीं कर सकते केवल आपके -

दूसरे मॉडल भी शुरू कर मान प्रदान करने के लिए होने के सामान्य कैविएट्स के साथ आर में nls() का उपयोग कर फिट किया जा सकता है आदि अनुकूलन में सांख्यिकीय मुद्दों जरूरी नहीं कि संख्यात्मक मुद्दों के रूप में ही कर रहे हैं किसी भी कार्यात्मक रूप को अनुकूलित करें इससे कोई फर्क नहीं पड़ता कि आप कौन सी भाषा चुनते हैं।

+3

यद्यपि आप 'y ~ poly (x, 2)' या 'y ~ ns (x, 2)' – hadley

1

शायद आपको अपने उदाहरणों (समान दिनचर्या का उपयोग करके बहुपद और तर्कसंगत कार्यों) में लचीलापन के साथ एक ही दिनचर्या नहीं मिल रही है, अकेले एक स्ट्रिंग को पार्स करने के लिए यह पता लगाने के लिए कि किस तरह के समीकरण फिट होना चाहिए ।

आपके पहले उदाहरण के लिए एक कम-वर्ग बहुपद फिटर उपयुक्त होगा। (यह आप पर निर्भर करता है कि किस डिग्री का उपयोग करने के लिए बहुपद - क्वाड्रैडिक, क्यूबिक, क्वार्टिक, आदि)। आपके दूसरे उदाहरण की तरह एक तर्कसंगत फ़ंक्शन के लिए, यदि आपको उपयुक्त लाइब्रेरी नहीं मिलती है तो आपको "अपना खुद का रोल" करना पड़ सकता है।साथ ही, ध्यान रखें कि आपके "वास्तविक" फ़ंक्शन को अनुमानित करने के लिए पर्याप्त उच्च-डिग्री बहुपद का उपयोग किया जा सकता है, जब तक आपको उस डेटा सेट की सीमाओं से परे बाहर निकलने की आवश्यकता न हो, जिसे आप फिट कर रहे हैं।

जैसा कि अन्य ने ध्यान दिया है, अन्य सामान्यीकृत पैरामीटर अनुमान एल्गोरिदम हैं जो उपयोगी साबित हो सकते हैं। लेकिन वे एल्गोरिदम काफी "प्लग और प्ले" नहीं हैं: उन्हें आमतौर पर आपको कुछ सहायक रूटीन लिखने की आवश्यकता होती है, और मॉडल पैरामीटर के लिए प्रारंभिक मानों की एक सूची प्रदान की जाती है। इस प्रकार के एल्गोरिदम को अलग करने के लिए संभव है, या शुरुआती पैरामीटर अनुमानों की दुर्भाग्यपूर्ण पसंद के लिए स्थानीय न्यूनतम या अधिकतम में फंस जाएं।

+0

के साथ बेहतर हो जाएंगे, जब मैं वाणिज्यिक उत्पादों का उपयोग करता हूं, तो मेरे पास आमतौर पर _no idea_ सबसे अच्छा काम करेगा। एलएबी फिट यह देखने के लिए कई सौ समीकरणों का प्रयास करेगा कि मैं निर्दिष्ट सीमा में डेटा को सर्वोत्तम तरीके से फिट करता हूं। – Nosredna

+0

मैंने उस मामले का उपयोग नहीं किया था - यदि आप डेटा सेट को चिह्नित करने के शुरुआती चरणों में हैं, तो यह कई परिवारों के कार्यों (रैखिक, बहुपद, शक्ति कानून, आवधिक ...) को समझने के लिए समझ में आता है। यह देखने के लिए कि एक अच्छा फिट कैसा दिख सकता है। मैं तदनुसार अपना जवाब संपादित करूंगा। –

+0

"इस तरह के एल्गोरिदम को अलग करने के लिए यह संभव है ..." हाँ, मुझे लगता है कि वाणिज्यिक कार्यक्रम केवल सभी जमानत के दौरान होता है जब यह होता है। जब आप एक समय में एक अभिव्यक्ति चुनते हैं तो वे आपको प्रारंभिक मानों के साथ खेलने देते हैं। – Nosredna

1

आर में, यह काफी आसान है।

निर्मित विधि को ऑप्ट() कहा जाता है। तर्क के रूप में यह संभावित पैरामीटर के एक प्रारंभिक वेक्टर, फिर एक समारोह के रूप में लेता है। आपको अपना खुद का त्रुटि फ़ंक्शन बनाना होगा, लेकिन यह वास्तव में सरल है।

तो फिर तुम इसे बाहर की तरह = optim (1, err_fn)

जहां err_fn

err_fn = function(A) { 
    diff = 0; 
    for(i in 1:data_length){ 
     x = eckses[i]; 
     y = data[i]; 
     model_y = A*x; 
     diff = diff + (y - model_y)^2 
    } 
    return(diff); 
} 

यह सिर्फ मानता है कि आपके eckses और डेटा में x और y मूल्यों का एक वेक्टर है कहते हैं। जैसा कि आप फिट देखते हैं, model_y लाइन बदलें, और भी पैरामीटर जोड़ें।

यह nonlinear पर ठीक काम करता है, मैं इसे चार आयामी ई^एक्स घटता के लिए उपयोग करता हूं और यह बहुत तेज़ है। आउटपुट डेटा में फिटिंग के अंत में त्रुटि मान शामिल होता है, जो कि मापने के लिए कितना अच्छा है, स्क्वायर मतभेदों (मेरे err_fn में) के रूप में दिया गया है।

संपादित करें: यदि आपको मॉडल में स्ट्रिंग के रूप में लेने की आवश्यकता है, तो आप अपने यूजर इंटरफेस को इस संपूर्ण मॉडल फिटिंग प्रक्रिया को आर स्क्रिप्ट के रूप में बना सकते हैं और इसे चलाने के लिए लोड कर सकते हैं। आर एसटीडीआईएन से या फ़ाइल से टेक्स्ट ले सकता है, इसलिए इस फ़ंक्शन की स्ट्रिंग को समकक्ष बनाने के लिए बहुत कठिन नहीं होना चाहिए, और इसे स्वचालित रूप से चलाएं।

+0

लेकिन क्यों आर में एनएलएस() का उपयोग नहीं करते? –

+0

मैं दो कारणों से एनएलएस का उपयोग नहीं करता हूं, सबसे पहले, मुझे त्रुटि फ़ंक्शन को अनुकूलित करने के लिए हस्तक्षेप करने में सक्षम होना पसंद है, और दूसरा, मैं वास्तव में आर के साथ अनुभव नहीं कर रहा हूं। इसलिए एनएलएस() बस मैंने जो लिखा है ? साफ। – Karl

+0

मेरा अंतिम लक्ष्य यह तारों की एक सूची सौंपना है और कोड को सर्वोत्तम फिट खोजने के लिए सभी को आज़माएं। – Nosredna

1

यदि आपके पास अपने गुणांक पर बाधाएं हैं, और आप जानते हैं कि एक विशिष्ट प्रकार का फ़ंक्शन है जिसे आप अपने डेटा में फिट करना चाहते हैं और यह फ़ंक्शन एक गन्दा है जहां मानक रिग्रेशन विधियां या अन्य वक्र फिटिंग विधियां ' टी काम, क्या आपने आनुवांशिक एल्गोरिदम माना है?

वे मेरी पहली पसंद नहीं हैं, लेकिन यदि आप दूसरे फ़ंक्शन के गुणांक को खोजने का प्रयास कर रहे हैं, तो शायद जीए काम करेंगे - खासकर यदि आप सर्वोत्तम फिट का मूल्यांकन करने के लिए गैर-मानक मीट्रिक का उपयोग कर रहे हैं। उदाहरण के लिए, यदि आप "(ए + बीएक्स + सीएक्स^2)/(डीएक्स + एक्स^2)" (जैसे कि आपके फ़ंक्शन और डेटा के बीच स्क्वायर अंतरों का योग न्यूनतम और "के गुणांक ढूंढना चाहते हैं, तो वहां परिणामस्वरूप फ़ंक्शन के आर्किलेन्थ पर कुछ बाधा, फिर एक स्टोकास्टिक एल्गोरिदम इस तक पहुंचने का एक अच्छा तरीका हो सकता है।

कुछ चेतावनी: 1) स्टोकास्टिक एल्गोरिदम सर्वोत्तम समाधान की गारंटी नहीं देंगे, लेकिन वे अक्सर बहुत करीब होंगे। 2) आपको एल्गोरिदम की स्थिरता के बारे में सावधान रहना होगा।

एक लंबे नोट पर, यदि आप उस चरण में हैं जहां आप उन कार्यों के कुछ स्थान से फ़ंक्शन ढूंढना चाहते हैं जो आपके डेटा को सर्वोत्तम रूप से फिट करते हैं (उदाहरण के लिए, आप अपने डेटा पर दूसरा मॉडल लगाने के लिए नहीं कहेंगे), तो जेनेटिक प्रोग्रामिंग तकनीक भी मदद कर सकती है।

+0

यह एक दिलचस्प विचार है। मैं इसके बारे में सोचूंगा। जाहिर है, यह धीमा होगा। वाणिज्यिक कार्यक्रम सेकंड में सैकड़ों समीकरण रूपों के माध्यम से चलाते हैं। – Nosredna

+0

हां, एक और नकारात्मक पक्ष यह है कि स्टोकास्टिक एल्गोरिदम धीमा हो सकता है। हालांकि, उल्टा पर, वाणिज्यिक कार्यक्रमों के माध्यम से चलने वाले सेट के बाहर एक समीकरण फ़ॉर्म प्राप्त करना संभव है। एक अनुवांशिक कार्यक्रम को कार्यों के * वर्ग * (उन कार्यों पर संचालन के साथ) जैसे पावर फ़ंक्शन, घातीय, लॉगरिदम, ट्रिग फ़ंक्शन, पीडीएफ/सीडीएफ आदि के माध्यम से खोजने की इजाजत देकर, एक निश्चित समाधान द्वारा दिए गए समाधान को ढूंढना संभव है समीकरण रूपों का सेट। लेकिन फिर से नीचे की ओर, इसके लिए एक उचित अप फ्रंट कोडिंग प्रयास की आवश्यकता होती है जो इसके लायक नहीं हो सकती है। –

+0

मैं हमेशा एक Quixotic साहसिक के लिए हूँ। – Nosredna

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