आर

2011-03-25 43 views
12

में बाध्य अनुकूलन I कुछ आर रैखिक बाधाओं के साथ आर में अनुकूलन करने के लिए आर में http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html का उपयोग करने की कोशिश कर रहा हूं लेकिन समस्या को स्थापित करने के तरीके को समझने में सक्षम नहीं है।आर

उदाहरण के लिए, मुझे $ f (x, y) = log (x) + \ frac {x^2} {y^2} $ को अधिकतम करने की आवश्यकता है बाधाओं के अधीन $ g_1 (x, y) = x + वाई < 1 $, $ g_2 (x, y) = x> 0 $ और $ g_3 (x, y) = y> 0 $। मैं आर में यह कैसे करूँ? यह सिर्फ एक काल्पनिक उदाहरण है। इसकी संरचना के बारे में चिंता न करें, इसके बजाय मुझे यह जानने में दिलचस्पी है कि इसे आर

धन्यवाद में कैसे सेट अप करें!

+1

@G और अन्य - क्या कोई समझा सकता है कि क्रॉस पोस्टिंग क्यों फेंक रही है? क्या यह उल्लेख करना स्वीकार्य होगा कि आप एक लिंक के साथ क्रॉस पोस्टिंग कर रहे हैं? मेरे पास एक तरह से या किसी और की मजबूत भावनाएं नहीं हैं, लेकिन इस मुद्दे पर कुछ स्पष्टता शायद वांछित है। यदि यह ऐसा कुछ है जो आर-समुदाय ने पहले से निपटाया है, तो मुझे लगता है कि उन चर्चाओं से जुड़ना एक अच्छी शुरुआत होगी। – Chase

+0

यदि आप "क्रॉस पोस्टिंग" के लिए मेटा टैब पर कोई खोज करते हैं तो आपको विभिन्न राय मिलती हैं, जिनमें से अधिकांश क्रॉस-पोस्टिंग की ओर अपेक्षाकृत स्वीकार्य हैं। (हालांकि, क्रॉस-पोस्टिंग, ज्यादातर लोगों को परेशान करने लगती है।) आर-हेल्प पोस्टिंग गाइड द्वारा निर्धारित आर-हेल्प और चचेरे भाई समूहों पर एक मजबूत एंटी-क्रॉस-पोस्टिंग नैतिकता है। पोस्टिंग गाइड को एसओ में संभावित होने के नाते मुझे मुश्किल समय लगता है। –

+0

@Chase जब लोग पोस्ट पार करते हैं और किसी को भी यह नहीं जानते हैं तो किसी के लिए किसी समस्या के समाधान को लिखना बहुत संभव है जो पहले ही हल हो चुका है जो कि उनके समय का अपशिष्ट हो सकता है। जब लोग इसे ज्ञात करते हैं तो लोग व्यक्तिगत रूप से परवाह नहीं करते हैं (और यह अत्यधिक नहीं है)। – Dason

उत्तर

16

समारोह की स्थापना तुच्छ था:

fr <- function(x) {  x1 <- x[1] 
    x2 <- x[2] 
    -(log(x1) + x1^2/x2^2) # need negative since constrOptim is a minimization routine 
} 

की स्थापना बाधा मैट्रिक्स ज्यादा दस्तावेज़ीकरण की कमी की वजह से समस्याग्रस्त था, और मैं प्रयोग का सहारा लिया। सहायता पृष्ठ कहता है "व्यवहार्य क्षेत्र ui% *% theta - ci> = 0" द्वारा परिभाषित किया गया है। इसलिए मैं परीक्षण किया है और यह करने के लिए "काम" लग रहा था:

> rbind(c(-1,-1),c(1,0), c(0,1)) %*% c(0.99,0.001) -c(-1,0, 0) 
     [,1] 
[1,] 0.009 
[2,] 0.990 
[3,] 0.001 

तो मैं प्रत्येक बाधा/सीमा के लिए एक पंक्ति में डाल दिया:

constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) # the thresholds 

इस समस्या के लिए वहाँ सभी मूल्यों के लिए कि में एक संभावित कठिनाई है एक्स का कार्य वाई -> 0. के रूप में इंफ में जाता है। मुझे अधिकतम को x = .95 और y = 0 मिलता है जब भी मैं प्रारंभिक मान को "कोने" पर धक्का देता हूं, लेकिन मुझे कुछ संदेह है कि यह है सही अनुमान नहीं जो मैंने अनुमान लगाया था "कोने" में था। संपादित करें: इस का पीछा मैं तर्क था कि ढाल अतिरिक्त "दिशा" प्रदान कर सकते हैं और एक ढाल समारोह कहा:

grr <- function(x) { ## Gradient of 'fr' 
    x1 <- x[1] 
    x2 <- x[2] 
    c(-(1/x[1] + 2 * x[1]/x[2]^2), 
     2 * x[1]^2 /x[2]^3) 
} 

यह "चलाने" था अनुकूलन थोड़ा सी के करीब (.999 ..., 0) कोने, इससे दूर जाने की बजाय, जैसा कि कुछ शुरुआती मूल्यों के लिए किया गया था। मैं कुछ हद तक निराश है कि इस प्रक्रिया लगता है रहने के लिए जब शुरू करने मूल्यों संभव क्षेत्र के केंद्र के करीब हैं "चट्टान के लिए सिर":

constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1), # the -x-y > -1 
               c(1,0), # the x > 0 
               c(0,1)), # the y > 0 
              ci=c(-1,0, 0)) 
$par 
[1] 9.900007e-01 -3.542673e-16 

$value 
[1] -7.80924e+30 

$counts 
function gradient 
    2001  37 

$convergence 
[1] 11 

$message 
[1] "Objective function increased at outer iteration 2" 

$outer.iterations 
[1] 2 

$barrier.value 
[1] NaN 

नोट: हंस वर्नर Borchers पर आर-सहायता के लिए एक बेहतर उदाहरण पोस्ट किया है कि किनारे से थोड़ी दूर बाधा स्थापित करके कोने मान प्राप्त करने में सफल:

> constrOptim(c(0.25,0.25), fr, NULL, 
       ui=rbind(c(-1,-1), c(1,0), c(0,1)), 
       ci=c(-1, 0.0001, 0.0001)) 
$par 
[1] 0.9999 0.0001 
+0

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

+0

एक व्यवहार्य क्षेत्र उन बिंदुओं का सेट है जो सभी बाधाओं को पूरा करते हैं। आपके विनिर्देश में एक त्रिकोण। –