我正试图通过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_
的算法。