設置功能是微不足道的:
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
@G和其他人 - 有人可以解釋爲什麼交叉發帖是不被理睬的嗎?提及您是通過鏈接交叉發佈是否可以接受?我沒有這種或那種強烈的感覺,但是在這個問題上可能需要澄清一些。如果這是以前R-社區已經處理過的事情,那麼我認爲將這些討論聯繫起來是一個好的開始。 – Chase 2011-03-25 21:45:06
如果您在Meta標籤上搜索「交叉發佈」,您會發現各種意見,其中大部分意見都相對接受交叉發佈。 (然而,同時交叉發佈似乎讓大多數人感到困擾。)R-Help發佈指南規定了r-help和堂兄弟組織之間強烈的反交情況。我很難將「發佈指南」看作SO中的證明。 – 2011-03-26 00:16:38
@Chase當人們交叉帖子並且不讓任何人知道時,那麼很有可能有人爲已經解決的問題寫一個解決方案,這可能會浪費他們的時間。我個人並不在乎人們是否會跨過帖子,只要他們知道(並不是過度)。 – Dason 2012-10-31 18:33:43