非线性优化问题中的错误:'x' 中的无限值或缺失值
Error in nonlinear optimization problem : infinite or missing values in 'x'
我不得不考虑模拟研究中的优化问题。下面举个例子:
library(mvtnorm)
library(alabama)
n = 200
q = 0.5
X <- matrix(0, nrow = n, ncol = 2)
X[,1:2] <- rmvnorm(n = n, mean = c(0,0), sigma = matrix(c(1,1,1,4),
ncol = 2))
x0 = matrix(c(X[1,1:2]), nrow = 1)
y0 = x0 - 0.5 * log(n) * (colMeans(X) - x0)
X = rbind(X, y0)
x01 = y0[1]
x02 = y0[2]
x1 = X[,1]
x2 = X[,2]
pInit = matrix(rep(1/(n + 1), n + 1), nrow = n + 1)
f1 <- function(p) mean(((n + 1) * p ) ^ q)
heq1 <- function(p)
c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
sol <- alabama::auglag(pInit, fn = function(p) -f1(p), heq = heq1)
cat("The maximum objective value is:", -sol$value, '\n')
这给出了错误:
Error in eigen(a$hessian, symmetric = TRUE, only.values = TRUE) :
infinite or missing values in 'x'
我不知道如何指出并克服这个问题。如果这是由于初始点指定错误引起的,如何在模拟工作中指定它,以便程序本身可以设置合适的初始点并给出正确的解决方案?否则,为什么会出现此错误以及如何摆脱它?有人可以帮忙吗?谢谢!
如前所述,见:
您必须防止求解器 运行 进入您的 objective 函数未定义的区域,这里这意味着每个索引 i
的 p_i >= 0
。如果是,让 objective 函数 return 一些有限值。简化你的函数(对于 q = 0.5
)它看起来像
f1 <- function(p) sum(sqrt(pmax(0, p)))
最好也为 p_i > 0
提供不等式约束,因为
heq1 <- function(p) c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
hin1 <- function(p) p - 1e-06
现在求解器 return 是一个合理的结果:
sol <- alabama::auglag(pInit, fn = function(p) -f1(p),
heq = heq1, hin = hin1)
-1 * sol$value
## [1] 11.47805
且均等条件全部满足:
heq1(sol$par)
## [1] -4.969690e-09 5.906888e-09 1.808652e-08
所有这些都可以做到 'programmatically',自然而然。
此答案是第一个答案的附录,特别针对您关于显着加快整个过程的第二个问题。
为了使 运行 时间估计可重现,我们将修复种子;
所有其他定义都是你的。
set.seed(4789)
n = 200
q = 0.5
X <- mvtnorm::rmvnorm(n = n, mean = c(0,0),
sigma = matrix(c(1,1,1,4), ncol = 2))
x0 = matrix(c(X[1,1:2]), nrow = 1)
y0 = x0 - 0.5 * log(n) * (colMeans(X) - x0)
X = rbind(X, y0)
x01 = y0[1]; x02 = y0[2]
x1 = X[,1]; x2 = X[,2]
pInit = matrix(rep(1/(n + 1), n + 1), nrow = n + 1)
首先,让我们使用增广拉格朗日和 optim()
作为内求解器。
f1 <- function(p) sum(sqrt(pmax(0, p)))
heq1 <- function(p) c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
hin1 <- function(p) p - 1e-06
system.time( sol <- alabama::auglag(pInit, fn = function(p) -f1(p),
heq = heq1, hin = hin1) )
## user system elapsed
## 24.631 0.054 12.324
-1 * sol$value; heq1(sol$par)
## [1] 7.741285
## [1] 1.386921e-09 3.431108e-10 4.793488e-10
这个问题是凸的,具有线性约束。因此,我们可以应用一个高效的凸求解器,例如 ECOS。对于建模,我们将使用 CVXR 包。
# install.packages(c("ECOSolveR", "CVXR"))
library(CVXR)
p <- Variable(201)
obj <- Maximize(sum(sqrt(p)))
cons <- list(p >= 0, sum(p) == 1,
sum(x1*p)==x01, sum(x2*p)==x02)
prbl <- Problem(obj, cons)
system.time( sol <- solve(prbl, solver="ECOS") )
## user system elapsed
## 0.044 0.000 0.044
ps <- sol$getValue(p)
cat("The maximum value is:", sum(sqrt(pmax(0, ps))))
## The maximum value is: 7.74226
c(sum(ps), sum(x1*ps) - x01, sum(x2*ps) - x02)
## [1] 1.000000e+00 -1.018896e-11 9.167819e-12
我们看到凸求解器比使用标准非线性求解器的第一种方法快大约 500 倍 (!)。重要提示:我们不需要起始值,因为凸问题只有一个最优值。
我不得不考虑模拟研究中的优化问题。下面举个例子:
library(mvtnorm)
library(alabama)
n = 200
q = 0.5
X <- matrix(0, nrow = n, ncol = 2)
X[,1:2] <- rmvnorm(n = n, mean = c(0,0), sigma = matrix(c(1,1,1,4),
ncol = 2))
x0 = matrix(c(X[1,1:2]), nrow = 1)
y0 = x0 - 0.5 * log(n) * (colMeans(X) - x0)
X = rbind(X, y0)
x01 = y0[1]
x02 = y0[2]
x1 = X[,1]
x2 = X[,2]
pInit = matrix(rep(1/(n + 1), n + 1), nrow = n + 1)
f1 <- function(p) mean(((n + 1) * p ) ^ q)
heq1 <- function(p)
c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
sol <- alabama::auglag(pInit, fn = function(p) -f1(p), heq = heq1)
cat("The maximum objective value is:", -sol$value, '\n')
这给出了错误:
Error in eigen(a$hessian, symmetric = TRUE, only.values = TRUE) :
infinite or missing values in 'x'
我不知道如何指出并克服这个问题。如果这是由于初始点指定错误引起的,如何在模拟工作中指定它,以便程序本身可以设置合适的初始点并给出正确的解决方案?否则,为什么会出现此错误以及如何摆脱它?有人可以帮忙吗?谢谢!
如前所述,见
您必须防止求解器 运行 进入您的 objective 函数未定义的区域,这里这意味着每个索引 i
的 p_i >= 0
。如果是,让 objective 函数 return 一些有限值。简化你的函数(对于 q = 0.5
)它看起来像
f1 <- function(p) sum(sqrt(pmax(0, p)))
最好也为 p_i > 0
提供不等式约束,因为
heq1 <- function(p) c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
hin1 <- function(p) p - 1e-06
现在求解器 return 是一个合理的结果:
sol <- alabama::auglag(pInit, fn = function(p) -f1(p),
heq = heq1, hin = hin1)
-1 * sol$value
## [1] 11.47805
且均等条件全部满足:
heq1(sol$par)
## [1] -4.969690e-09 5.906888e-09 1.808652e-08
所有这些都可以做到 'programmatically',自然而然。
此答案是第一个答案的附录,特别针对您关于显着加快整个过程的第二个问题。
为了使 运行 时间估计可重现,我们将修复种子; 所有其他定义都是你的。
set.seed(4789)
n = 200
q = 0.5
X <- mvtnorm::rmvnorm(n = n, mean = c(0,0),
sigma = matrix(c(1,1,1,4), ncol = 2))
x0 = matrix(c(X[1,1:2]), nrow = 1)
y0 = x0 - 0.5 * log(n) * (colMeans(X) - x0)
X = rbind(X, y0)
x01 = y0[1]; x02 = y0[2]
x1 = X[,1]; x2 = X[,2]
pInit = matrix(rep(1/(n + 1), n + 1), nrow = n + 1)
首先,让我们使用增广拉格朗日和 optim()
作为内求解器。
f1 <- function(p) sum(sqrt(pmax(0, p)))
heq1 <- function(p) c(sum(x1 * p) - x01, sum(x2 * p) - x02, sum(p) - 1)
hin1 <- function(p) p - 1e-06
system.time( sol <- alabama::auglag(pInit, fn = function(p) -f1(p),
heq = heq1, hin = hin1) )
## user system elapsed
## 24.631 0.054 12.324
-1 * sol$value; heq1(sol$par)
## [1] 7.741285
## [1] 1.386921e-09 3.431108e-10 4.793488e-10
这个问题是凸的,具有线性约束。因此,我们可以应用一个高效的凸求解器,例如 ECOS。对于建模,我们将使用 CVXR 包。
# install.packages(c("ECOSolveR", "CVXR"))
library(CVXR)
p <- Variable(201)
obj <- Maximize(sum(sqrt(p)))
cons <- list(p >= 0, sum(p) == 1,
sum(x1*p)==x01, sum(x2*p)==x02)
prbl <- Problem(obj, cons)
system.time( sol <- solve(prbl, solver="ECOS") )
## user system elapsed
## 0.044 0.000 0.044
ps <- sol$getValue(p)
cat("The maximum value is:", sum(sqrt(pmax(0, ps))))
## The maximum value is: 7.74226
c(sum(ps), sum(x1*ps) - x01, sum(x2*ps) - x02)
## [1] 1.000000e+00 -1.018896e-11 9.167819e-12
我们看到凸求解器比使用标准非线性求解器的第一种方法快大约 500 倍 (!)。重要提示:我们不需要起始值,因为凸问题只有一个最优值。