我有一个TxN
矩阵M
和一个Nx1
权重向量w
,其中sum(w)=1
。
我需要找到w
,这会最大化Mw
中的正元素数量
如果没有单w
,则需要Mw
的最大可能值。
更正式地,用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:舍入错误导致a 优化算法的细分。在这种情况下,返回的最小值可以 仍然有用。
迭代次数....: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
。