【问题标题】:Optimizing a function in R with more than one solution使用多个解决方案优化 R 中的函数
【发布时间】:2016-09-12 11:49:54
【问题描述】:

我正在尝试优化(最小化)具有两个参数的函数,该参数应该具有唯一的解决方案。

foo <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  t=5-sqrt((0-x1)^2+(0-x2)^2);
  u=4-sqrt((0-x1)^2+(4-x2)^2);
  v=3-sqrt((3-x1)^2+(0-x2)^2);
  return(sum(t,u,v))
}    

optim(c(0,0), foo)

那些热爱中学数学的人可能会认出笛卡尔 (x,y) 坐标平面上两点之间距离的公式。函数 foo 是这样编写的,x1 是 x 坐标,x2 是我要查找的点的 y 坐标。在这种情况下,该点是 (3,4)。但是,我得到了一个奇怪的输出:

optim(c(0,0), foo)
$par
[1] -3.938866e+54  1.293779e+54

$value
[1] -1.243772e+55

$counts
function gradient 
     501       NA 

$convergence
[1] 1

$message
NULL

知道出了什么问题吗?

【问题讨论】:

  • 猜猜你把 solution 的概念(即寻找函数的零点)和寻找函数的最小值(或最大值)搞混了。 optim 是后者,而我猜你对前者感兴趣。
  • 如果你试图找到最小值,那么平方根应该是正数而不是负数。如果为负数,则最小值是距离这三个点最远的点。

标签: r optimization


【解决方案1】:

事实上,您的函数没有最小值,因为 t、u 和 v 随着 x1 和 x2 离三个固定点 (0,0)、(0,4) 和 (3,0) 越远而减小。

您似乎想找到一个点 (x1,x2) 来最小化到这三个点的距离。如果是这种情况,您应该将 f 定义为:

foo <- function(x) {
  x1 <- x[1]
  x2 <- x[2]
  t = 5 + sqrt((0-x1)^2+(0-x2)^2);
  u = 4 + sqrt((0-x1)^2+(4-x2)^2);
  v = 3 + sqrt((3-x1)^2+(0-x2)^2);
  return(sum(t,u,v))
} 

请注意,唯一的变化是 -sqrt+sqrt

答案不是你所期望的点 (3,4),最小值是三角形内以这三个点为顶点的点。

解决方案:

> z
$par
[1] 0.7510095 0.6954136

$value
[1] 18.76643

$counts
function gradient 
      59       NA 

$convergence
[1] 0

$message
NULL

红点是解决方案:

【讨论】:

    【解决方案2】:

    主要问题是 3 和 4 颠倒了。另一个是您的分歧已签署。但例程也可以收敛到不是绝对最小值的局部最小值。而是:

    foo <- function(x) {
      t=5-sqrt((0-x[1])^2+(0-x[2])^2);
      u=3-sqrt((0-x[1])^2+(4-x[2])^2);
      v=4-sqrt((3-x[1])^2+(0-x[2])^2);
      return(sum(abs(t),abs(u),abs(v)))
    }    
    
    optim(c(4,0), foo)
    

    【讨论】:

    • 我本来可以不理会你的 x1 和 x2,我只是想看看它们是否会导致一些类型转换错误(它们不是)。输出为 $par [1] 3 4 $value [1] 1.074521e-07 $counts 函数梯度 125 NA $convergence [1] 0 $message NULL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2019-05-07
    • 2017-07-05
    • 1970-01-01
    相关资源
    最近更新 更多