通过优化加权向量来最大化目标数量

时间:2015-12-28 15:09:06

标签: r optimization

我试图通过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新手R一直努力使用optim()(忽略我的约束)和constrOptim()函数,遇到错误

  

match.arg(方法)出错:'arg'的长度必须为1

使用optim()

  

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

使用constrOptim()时。

非常感谢有关如何为此类优化问题设置代码的任何帮助。

1 个答案:

答案 0 :(得分:1)

以下是使用库String sql2 = "SELECT type, amount FROM lasttransactions where cust_id = ?"; PreparedStatement ps2=conn.prepareStatement(sql2); ps2.setInt(1,Integer.parseInt(_userid)); ResultSet rs2=ps2.executeQuery(); DefaultTableModel model = (DefaultTableModel) transtable.getModel(); Object[] row; String type; double amount ; while(rs2.next()) { type = rs2.getString("type"); amount = rs2.getDouble("amount"); row = new Object []{ type, amount }; model.addRow(row); JOptionPane.showMessageDialog(null,"added !"); transtable.setModel(model); } 的解决方案。

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算法的结果最佳为42.您可以按NLOPT_LN_NEWUOA_BOUND查看所有可用的算法。请注意,算法名称中的nloptr.print.options()表示不需要衍生物。在你的情况下,衍生计算并不困难。您可以提供它,并在名称中使用_XN_的算法。