我有一个TxN
矩阵M
和一个Nx1
权重向量w
,其中sum(w)=1
。
我需要找到w
,它使 中的正元素的数量最大化Mw
。
如果没有单个w
,则 Mw
需要最大可能值。
更正式地说,用 -row in 表示M_t
,t
那么M
我需要
max_w Sum_t I(M_t w)
sub 1'w=1
其中1
是 1 的向量,如果为正,则函数I(x)
返回,否则返回。1
x
0
注意:如果将目标函数除以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_EQ
为NLOPT_GN_ISRES
:
NLopt 求解器状态:-2(NLOPT_INVALID_ARGS:无效参数(例如,下限大于上限,指定了未知算法等)。)
我是 nloptr 的新手,所以我想知道接下来会发生什么。
据我了解,我对f
(-33) 的结果是可靠的,容差为 1.0e-7。这个对吗?
我如何说明值是否w
是唯一的?
的语法是NLOPT_GN_ISRES
什么?
目标f
包含一个隐式if
条件,我仍然可以使用(数字)梯度吗?
其他软件包(例如阿拉巴马州)是否更擅长此类问题?
更新将起点更改为w
.