【问题标题】:Maximize a target number by optimizing a weighting vector通过优化权重向量最大化目标数
【发布时间】:2015-12-30 16:49:31
【问题描述】:

我正在尝试通过一个 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() 函数时遇到错误

match.arg(method) 中的错误:“arg”的长度必须为 1

optim()被使用时

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

何时使用constrOptim()

任何有关如何为此类优化问题设置代码的帮助将不胜感激。

【问题讨论】:

  • 我使用nloptr 包和函数来优化约束。请附上一个示例数据集pca,以便我写下答案。
  • 非常感谢,我不知道如何上传数据,但它是一个 42x42 矩阵,如果有帮助,所有元素都在 -1 和 1 之间?或者,也许我可以以某种方式将数据集发送给您?
  • 请阅读this线程。
  • dput 命令产生的输出太大而无法从控制台复制,因此我将其写入此 csv 文件,希望它能正常工作。 dropbox.com/s/ga99tgt1q7a5rz4/pca.csv?dl=0
  • 您能否详细说明您正在解决的问题 - 是科学问题还是现实问题。这种熵最大化的背后是什么?

标签: r optimization


【解决方案1】:

这是使用库 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_ 的算法。

【讨论】:

  • 我正在尝试为此添加一个不等式约束,但不断收到错误消息:Error: nlopt_add_inequality_mconstraint returned NLOPT_INVALID_ARGS。是否也可以给我这个格式?约束是 A* w - B >= 0,其中 A=matrix(runif(42,0.5,3), nrow=1, ncol=42) 和 B 是一个常数。
  • 您应该使用参数eval_g_ineq,它在解决方案g(w) &lt;= 0 中具有这样的功能。所以它应该是这样的:g &lt;- function(w) B - A %*% w.
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多