【问题标题】:constrained optimization in RR中的约束优化
【发布时间】:2011-07-23 03:20:21
【问题描述】:

我正在尝试在 R 中使用 http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html 在 R 中使用一些给定的线性约束进行优化,但无法弄清楚如何设置问题。

例如,我需要最大化 $f(x,y) = log(x) + \frac{x^2}{y^2}$ 受限于 $g_1(x,y) = x+y 0$ 和 $g_3(x,y) = y > 0$。我如何在 R 中做到这一点?这只是一个假设的例子。不要担心它的结构,相反我很想知道如何在 R 中设置它。

谢谢!

【问题讨论】:

  • @G 和其他人 - 有人能解释一下为什么不赞成交叉发帖吗?提及您正在使用链接交叉发布是否可以接受?我没有任何强烈的感觉,但可能有必要对这个问题进行一些澄清。如果这是整个 R 社区以前处理过的事情,我想链接到这些讨论将是一个好的开始。
  • 如果您在 Meta 选项卡上搜索“交叉发布”,您会发现各种各样的意见,其中大部分都比较接受交叉发布。 (然而,同时交叉发布似乎惹恼了大多数人。)R-Help 发布指南规定的 r-help 和表亲组有强烈的反交叉发布伦理。我很难看到发布指南在 SO 中具有证明性。
  • @Chase 当人们跨过帖子并且不让任何人知道时,那么某人很有可能为已经解决的问题编写解决方案,这可能会浪费他们的时间。我个人不在乎人们是否会跨帖子,只要他们公开(并且不过分)。
  • 如果有人需要从交叉邮件中查看 Rhelp 上的答案,请点击此处:stat.ethz.ch/pipermail/r-help/2011-March/273099.html

标签: r optimization constraints


【解决方案1】:

设置函数很简单:

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 的所有值,函数在 y -> 0 时变为 Inf。即使我推入起始值,我也会在 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

注意:Hans Werner Borchers 在 R-Help 上发布了一个更好的示例,该示例通过将约束设置为稍微远离边缘来成功获取角值:

> 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

【讨论】:

  • 这很有帮助。我发布的示例并不理想,但我可以看到如何设置该功能。什么是可行域?
  • 可行域是满足所有约束的点的集合。您的规范中的三角形。
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多