2013-06-09 3 views
5

मान लीजिए मैं एक समारोह है किकैसे

myFunction = function(input1, input2, input3) { 
    # do something with input and then return 
} 

निम्नलिखित और अब मैं केवल पहला इनपुट से अधिक myFunction कम करने के लिए, अर्थात्, input1 चाहते रूप में परिभाषित किया है, जबकि फिक्सिंग आर में एक इनपुट पैरामीटर पर एक समारोह को कम करने के अन्य पैरामीटर।

आर में, ऐसा लगता है कि nlm, optim, आदि जैसे कुछ प्रीपेक्ड फ़ंक्शंस हैं लेकिन दस्तावेज़ीकरण वास्तव में ऊपर की समस्या को कैसे हल नहीं करता है। उदाहरण के लिए, ऐसा लगता है कि optim केवल 1 इनपुट पर फ़ंक्शन को कम कर सकता है? मैं शायद गलत हूं, लेकिन कृपया मुझे सही करें, और मुझे इस तरह की कम करने वाली समस्या करने का सलाह दिया गया तरीका दिखाएं।

बहुत बहुत धन्यवाद!

उत्तर

5

इनपुट वेक्टर होने पर आउटपुट को कम करने के लिए, आप optim का उपयोग कर सकते हैं।

myFunction = function(input1, input2, input3) sum(abs(input1 - 3)) 
o = optim(7:10, myFunction, input2=5, input3=6) 
o$par 
# [1] 2.999989 2.999995 3.000000 3.000001 

optim (7:10 मेरे उदाहरण में) के लिए पहला तर्क input1 के लिए प्रारंभ मूल्य (जहां अनुकूलन शुरू करने के लिए की एक अनुमान) है। दूसरा कार्य है, और फिर आप निश्चित पैरामीटर (जैसे input2 और input3) में पास कर सकते हैं।

इस उदाहरण में, न्यूनतम केवल 3s का वेक्टर होता है (जैसा कि sum(abs(input1 - 3)) को कम करता है)।


तुम सिर्फ एक 1-आयामी न्यूनतम प्रदर्शन कर रहे थे, तो आप optimize समारोह का प्रयोग करेंगे, और समारोह पास करने के बाद यह करने के लिए अन्य इनपुट पारित:

myFunction = function(input1, input2, input3) { 
    return(abs(input1 - 3) + input2 + input3) 
} 

o = optimize(myFunction, 2, 3, interval=c(-100, 100)) 
print(o$minimum) 
# [1] 3.000003 

आप आधारित कम करने के लिए चाहते हैं input2 या input3 (एक है कि कार्य करने के लिए पहला तर्क नहीं है) पर, आप नामित तर्क के रूप में दूसरों को दे सकते हैं:

myFunction = function(input1, input2, input3) { 
    return(abs(input1 - 3) + abs(input2 - 12) + input3) 
} 

print(optimize(myFunction, input1=2, input3=3, interval=c(-100, 100))) 
print(o$minimum) 
[1] 11.99998 
function (f, interval, ..., lower = min(interval), upper = max(interval), 
      maximum = FALSE, tol = .Machine$double.eps^0.25) 

कि ... अतिरिक्त पैरामीटर के किसी भी संख्या का उपयोग करते हैं कि यह तो myFunction में पास कर सकते हैं: 510,403,210 आप सोच रहे हैं कि क्यों यह संभव है, क्योंकि optimize परिभाषित किया गया है के रूप में है।

+3

इस अतिरिक्त फ़ंक्शन (करीइंग) के लिए कोई आवश्यकता नहीं है; आप बस '...' के माध्यम से अतिरिक्त तर्क पारित कर सकते हैं: 'ओ = ऑप्टिमाइज़ (मेरा फ़ंक्शन, 2, 3, अंतराल = सी (-100, 100)) ' – baptiste

+0

@ बैपटिस्ट: ईमानदारी से धन्यवाद- मुझे पता नहीं था कि मुमकिन। –

+0

मैं आपके विस्तृत उत्तर के लिए धन्यवाद देखता हूं! – Enzo