【问题标题】:Find minimums with R (1 Variable X, n times a fixed parameter U)用 R 求最小值(1 个变量 X,n 次固定参数 U)
【发布时间】:2016-03-02 12:29:31
【问题描述】:

我正在尝试最小化函数 f(X,U) = (X*log(X)-1/(1-U))^2 其中 U=(U_1,...,U_n) ~ U(0,1),这意味着我有 n 个固定 U 并且想要找到以下的最小值:

(x_1*ln(x_1)-1/(1-u_1))^2
(x_2*ln(x_2)-1/(1-u_2))^2
......
(x_n*ln(x_n)-1/(1-u_n))^2

为此,我想使用 optim 函数。

我已经定义了:

n <- 10^3 
U <- sort(runif(n,min=0,max=1)) 
X <- c()
Xsolution<- c()

f <- function(X,U){
 return(-(X*log(X)-(1/(1-U)))^2)
}  #-, because min(f) = max(-f)

现在我不知道如何用 optim() 做到这一点?对于以下代码,我总是收到以下错误:

for(i in 1:n){
    Xsolution[i] <- optim(f(X,U[i])
}

log(X) 中的错误:数学函数的非数字参数


旁注:我会欢迎没有 for 循环的方法,因为对于伟大的 n,它会花费太长时间。也许你可以帮我让它与 sapply 一起工作?还是另一种方式?

另外,我认为我可以使用 optimize(...,maximize=FALSE,..):

f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)

for (i in 1:n){
  xmin[i] <- optimize(f, c(0, 10000), tol = 0.0001, a = U[i])
}

这也不能正常工作...

另外,问题可能是它需要太长时间。我想用 n=10^6 来做。但是我很确定必须有一种方法可以在没有for循环的情况下做到这一点?我认为 for 循环是导致这需要很长时间的问题。请帮帮我,我一直在这个问题上坐了很久,这很令人沮丧。

【问题讨论】:

  • 没错,xmin 的所有条目都是相等的。我该如何解决这个问题?
  • 问题出在哪里?我有一个向量 U = (u1,...un) ,其中 u 是固定的,我想要方程 x1*log(x1) - 1/(1-u1) 的解,这适用于 U 中的所有 u_i。

标签: r loops for-loop optimization minimum


【解决方案1】:

由于X * log(X) = 1 / (1 - U[i]) 可以对任何U[i] 进行数值求解,因此每个不同的U[i] 都有一个解,因此可以将任何(X*ln(X)-1/(1-U[i]))^2 驱动为零,因此每个不同的U[一世]。如果通常 U[i] 都是不同的,则意味着存在长度(U)解。解决方案由下式给出(如果 U[i] 都是不同的,则可以省略唯一的):

f <- function (X, a) ((X*log(X)-(1/(1-a)))^2)
unique(sapply(U, function(a) optimize(f, c(0, 1000000), a = a)$minimum))

【讨论】:

  • 谢谢!我也通过这种方式使用 for 循环解决了它:xmin &lt;- c() f &lt;- function (x, a) (x*log(x)-(1/(1-a)))^2 for(i in 1:n){ xmin[i] &lt;- optimize(f, c(0, 10^10), tol = 0.0001, a=U[i])$minimum } 目前,我正在寻找哪个更快。谢谢!
  • 我认为优化是需要时间的,无论您使用sapply 还是for 都不会有太大的不同。
  • 我做了一些测试:对于 10^6 的数据,for 循环需要 22 到 26 分钟,而上面的相同函数和 sapply 需要 4 到 8 分钟。
  • 如果您预先分配结果向量而不是逐步扩展它,那么循环将运行得更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 2017-03-23
  • 2019-06-08
  • 2023-04-02
  • 2019-11-05
  • 2021-04-29
  • 1970-01-01
相关资源
最近更新 更多