我试图通过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()
时。
非常感谢有关如何为此类优化问题设置代码的任何帮助。
答案 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_
的算法。