用 R 求最小值(1 个变量 X,n 次固定参数 U)

Posted

技术标签:

【中文标题】用 R 求最小值(1 个变量 X,n 次固定参数 U)【英文标题】:Find minimums with R (1 Variable X, n times a fixed parameter 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。 【参考方案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 分钟。 如果您预先分配结果向量而不是逐步扩展它,那么循环将运行得更快。

以上是关于用 R 求最小值(1 个变量 X,n 次固定参数 U)的主要内容,如果未能解决你的问题,请参考以下文章

求传入N个参数的最大最小值

如何 求多元一次函数的最大值

求JAVA的两整数输出最大最小值以及两个数的和差积商的程序

最小二乘法求AR模型

最小二乘法求AR模型

Matlab中已知函数值的最小值求对应的自变量值...