2

我有一个TxN矩阵M和一个Nx1 权重向量w,其中sum(w)=1
我需要找到w,它使 中的正元素的数量最大化Mw
如果没有单个w,则 Mw需要最大可能值。

更正式地说,用 -row in 表示M_tt那么M我需要

max_w  Sum_t I(M_t w)
sub    1'w=1    

其中1是 1 的向量,如果为正,则函数I(x)返回,否则返回。1x0

注意:如果将目标函数除以T,则和可以被认为是随机变量加权和的频率。

数据可以模拟如下:

N <- 4
set.seed(1)
M <-  matrix(rnorm(200), ncol=N)
w <- as.matrix(rep(1/N, N))
one <- as.matrix(rep(1, N))

目标函数和约束为:

I <- function(r) as.numeric(r>0)
f <- function(x) -sum(sapply(M %*% x, I))
h <- function(x) t(one) %*% x - 1

现在在 R 中,一种可能性可能是nloptr

library(nloptr)
local_opts <- list( "algorithm" = "NLOPT_LN_AUGLAG_EQ",
                    "xtol_rel" = 1.0e-7 )
opts <- list( "algorithm" = "NLOPT_LN_AUGLAG_EQ",
              "xtol_rel" = 1.0e-7,
              "maxeval" = 100000,
              "local_opts" = local_opts,
              "print_level" = 2)

nloptr( x0=as.vector(w),  eval_f=f, eval_g_eq=h, opts=opts)

我得到:

NLopt求解器状态:-4(NLOPT_ROUNDOFF_LIMITED:舍入错误导致优化算法崩溃。在这种情况下,返回的最小值可能仍然有用。
迭代次数......:17530
终止条件:xtol_rel:1e-07 maxeval :1e+05
[...]
目标函数的当前值:-33
控件的当前值:0.5175225 0.1124845 0.1598906 0.2101024

请注意,17530 次迭代远远少于 maxeval (100000)。

我不知道如何正确使用 NLOPT_GN_ISRES,这可能会提高速度。替换NLOPT_LN_AUGLAG_EQNLOPT_GN_ISRES

NLopt 求解器状态:-2(NLOPT_INVALID_ARGS:无效参数(例如,下限大于上限,指定了未知算法等)。)

我是 nloptr 的新手,所以我想知道接下来会发生什么。

据我了解,我对f(-33) 的结果是可靠的,容差为 1.0e-7。这个对吗?
我如何说明值是否w是唯一的?
的语法是NLOPT_GN_ISRES什么?
目标f包含一个隐式if条件,我仍然可以使用(数字)梯度吗?
其他软件包(例如阿拉巴马州)是否更擅长此类问题?

更新将起点更改为w.

4

0 回答 0