用 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 <- c() f <- function (x, a) (x*log(x)-(1/(1-a)))^2 for(i in 1:n) xmin[i] <- 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)的主要内容,如果未能解决你的问题,请参考以下文章