2011-03-25 161 views
12

我試圖用R中的http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html來做R中的優化,但有一些給定的線性約束,但無法弄清楚如何設置問題。R中的約束優化

例如,我需要最大化$ f(x,y)= log(x)+ \ frac {x^2} {y^2} $受到約束$ g_1(x,y)= x + (x,y)= x> 0 $和$ g_3(x,y)= y> 0 $。我如何在R中做到這一點?這只是一個假設的例子。不要擔心它的結構,而是我有興趣知道如何在R中設置它。

謝謝!

+1

@G和其他人 - 有人可以解釋爲什麼交叉發帖是不被理睬的嗎?提及您是通過鏈接交叉發佈是否可以接受?我沒有這種或那種強烈的感覺,但是在這個問題上可能需要澄清一些。如果這是以前R-社區已經處理過的事情,那麼我認爲將這些討論聯繫起來是一個好的開始。 – Chase 2011-03-25 21:45:06

+0

如果您在Meta標籤上搜索「交叉發佈」,您會發現各種意見,其中大部分意見都相對接受交叉發佈。 (然而,同時交叉發佈似乎讓大多數人感到困擾。)R-Help發佈指南規定了r-help和堂兄弟組織之間強烈的反交情況。我很難將「發佈指南」看作SO中的證明。 – 2011-03-26 00:16:38

+0

@Chase當人們交叉帖子並且不讓任何人知道時,那麼很有可能有人爲已經解決的問題寫一個解決方案,這可能會浪費他們的時間。我個人並不在乎人們是否會跨過帖子,只要他們知道(並不是過度)。 – Dason 2012-10-31 18:33:43

回答

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 

對於這個問題存在一個潛在的困難,對於所有的值x的函數轉換爲Inf,當y - > 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) 
} 

這並「引導」優化有點接近C(.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的張貼在R-幫助一個更好的例子,通過將約束設置爲稍微遠離邊緣來成功獲得角點值:

> 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 2011-03-25 22:48:19

+0

可行區域是滿足所有約束條件的點集。規格中的三角形。 – 2011-03-25 23:06:30