使用R包nloptr求解相关系数最大化问题报错如何解决
问题排查与修复方案
错误核心原因
- nloptr的目标函数、约束函数仅支持单个向量作为入参,所有待优化变量都会按
x0的顺序打包为这个向量传入函数。你之前将两个权重拆分为x、y两个独立入参,调用时nloptr只会传入一个向量参数,导致y参数缺失报错 - 代码存在笔误:线性组合部分漏写乘号,
xdata$b应为x*data$b,ydata$c应为y*data$c - nloptr默认求解最小化问题,你的需求是最大化相关系数,需要将目标函数返回值改为负的相关系数,将最大化问题转为最小化问题求解
- 约束函数同样需要适配单向量入参的要求
修正后可运行代码
library(nloptr) # 创建示例数据集 data <- data.frame( "a" = c(1:10), "b" = c(2,3,4,2,3,1,2,4,1,6), "c" = rep(c(10,15), 5) ) # 目标函数:仅接收单个向量参数x,x[1]对应b的权重,x[2]对应c的权重 eval_f <- function(x) { # 最大化相关系数等价于最小化负相关系数 return (-cor(data$a, (x[1]*data$b + x[2]*data$c))) } # 等式约束:同样仅接收单个向量参数 eval_g_eq <- function(x) { return (x[1] + x[2] - 1) } # 上下界、初始值设置保持不变 lb <- c(0,0) ub <- c(1,1) x0 <- c(0.5,0.5) # 优化参数设置 local_opts <- list( "algorithm" = "NLOPT_LD_MMA", "xtol_rel" = 1.0e-15 ) opts <- list( "algorithm" = "NLOPT_GN_ISRES", "xtol_rel" = 1.0e-15, "maxeval" = 160000, "local_opts" = local_opts, "print_level" = 0 ) # 运行优化 res <- nloptr( x0 = x0, eval_f = eval_f, lb = lb, ub = ub, eval_g_eq = eval_g_eq, opts = opts ) # 结果输出 print(res) cat("最优权重:b的权重 =", res$solution[1], ",c的权重 =", res$solution[2], "\n") cat("最大化后的相关系数:", -res$objective, "\n")
结果说明
修正后代码不会再报参数缺失错误,输出的res$solution即为满足权重和为1条件下、相关系数最大的权重组合,取-res$objective即可得到你需要的最大相关系数。
内容的提问来源于stack exchange,提问作者chars fregtun
相关产品推荐
相关产品推荐

