r-通过优化加权向量使目标数最大化



我正试图通过1x42加权向量(权重)最大化数字N_ent。

N_ent通过以下函数计算:

N_ent <- exp(-sum((((solve(pca$rotation[])) %*% t(weight))^2)*
  (pca$sdev^2)/(sum((((solve(pca$rotation[])) %*% t(weight))^2)*
  (pca$sdev^2)))*log((((solve(pca$rotation[])) %*% t(weight))^2)*
  (pca$sdev^2)/(sum((((solve(pca$rotation[])) %*% t(weight))^2)*(pca$sdev^2)))))) 

尽管它看起来相当复杂,但该方程运行良好,并在使用0.0238(1/42=0.0238)的等权重时为我提供了N_ent = 1.0967

此外,任何重量都不能低于-0.1或高于1。

我是R的新手,很难同时使用optim()(忽略我的约束)和constrOptim()函数,遇到错误

匹配中出错。arg(方法):"arg"的长度必须为1

当使用optim()和时

ui%*%theta中的错误:不一致的参数

当使用CCD_ 6时。

任何关于如何为这样的优化问题设置代码的帮助都将不胜感激。

以下是使用库nloptr的解决方案。

library(nloptr)
pca <- dget('pca.csv')
#random starting point
w0 <- runif(42, -0.1, 1)
#things that do not depend on weight
rotinv <- solve(pca$rotation)
m2 <- pca$sdev^2
#function to maximize
N_ent <- function(w) {
  m1 <- (rotinv %*% w)^2
  -exp(-sum(m1 * m2 / sum(m1 * m2) * log(m1 * m2 / sum(m1 * m2))))
}
#call optimization function
optres <- nloptr(w0, N_ent, lb = rep(-0.1, 42), ub = rep(1, 42),
                 opts = list('algorithm' = 'NLOPT_LN_NEWUOA_BOUND', 'print_level' = 2, 'maxeval' = 1000, 'xtol_rel' = 0))

您可以通过optres$solution查看结果。对于您的特定问题,我发现NLOPT_LN_NEWUOA_BOUND算法给出了42的最佳结果。您可以通过nloptr.print.options()查看所有可用的算法。注意,算法名称中的_XN_表示不需要导数的算法。在你的情况下,导数计算并没有那么困难。您可以提供它并使用名称中带有_XD_的算法。

最新更新