使用DEoptimR包JDEoptim优化企业排名NDCG不收敛且不满足约束求助
问题原因分析
- 目标函数方向错误:
JDEoptim默认执行最小化目标函数的逻辑,而你当前传入的otimizar返回值是越高越好的NDCG,相当于算法在往NDCG降低的方向迭代,自然无法得到高NDCG的结果。 - 约束逻辑适配错误:
JDEoptim的constr参数默认仅支持不等式约束,要求所有约束返回值≤0时才判定为可行解,你直接传入等式约束的残差,会导致几乎所有参数都被判定为不可行,自然无法满足你的约束要求。 - 参数映射逻辑错误:你定义的
lower和upper维度是32位,但约束函数restricao仅使用了pesos的前10位,剩余22个参数完全没有纳入约束校验;同时你将同一个pesos下标赋值给多个变量(比如nota_contratos和nota_contratos_at都取pesos[2]),除非你明确需要这两个权重强制相等,否则这个赋值逻辑会导致参数和指标的对应关系完全错乱。 - 优化配置参数过小:差分进化算法的种群规模
NP=10、最大迭代次数maxiter=10远低于32维参数的搜索需求,算法还未完成有效搜索就提前终止,无法逼近最优解。
解决方案
- 修正目标函数方向
修改自定义函数otimizar的返回值,将原NDCG结果取负值后返回,适配JDEoptim的最小化逻辑,等价于最大化NDCG:
# 原otimizar返回逻辑修改示例 return(-Evaluation.NDCG(你的输入参数))
- 修正约束逻辑
先梳理清楚32个参数和各指标的对应关系,修正restricao里的参数赋值错误,再将等式约束转换为带容差的不等式约束,或者添加软约束惩罚项到目标函数,示例(转不等式约束):
restricao <- function(pesos) { # 先修正所有参数的赋值逻辑,确保32个参数都对应到正确变量 sum1 = 第一组变量求和结果 sum2 = 第二组变量求和结果 tol = 1e-4 # 可自行调整的约束容差 # 返回4个不等式约束,所有值≤0时满足要求 return(c( sum1 - 1 - tol, -(sum1 - 1) - tol, sum2 + 1 - tol, -(sum2 + 1) - tol )) }
如果用软约束方案,可以直接在目标函数里添加惩罚项:
otimizar <- function(pesos) { ndcg = Evaluation.NDCG(你的计算逻辑) sum1 = 第一组变量求和 sum2 = 第二组变量求和 # 违反约束的惩罚,权重100可根据需要调整 penalty = 100 * (abs(sum1 - 1) + abs(sum2 + 1)) return(-ndcg + penalty) }
- 调整优化参数配置
根据参数维度调整种群和迭代次数,32维参数推荐配置:
otimzacao=JDEoptim(lower, upper,fn = otimizar, tol = 1e-4, constr = restricao,trace = TRUE, NP = 160, maxiter = 500)
- 优化后校验
得到最优参数后,单独调用约束函数和NDCG计算逻辑,校验约束满足度和实际NDCG值,若仍不满足要求可进一步调大惩罚权重、缩小参数上下限范围,或继续增加迭代次数。
内容的提问来源于stack exchange,提问作者Hernandes Matias Junior
相关产品推荐
相关产品推荐

