我正在尝试使用 scipy.optimize.differential_evolution 进行优化。我想为 20 个变量找到最佳权重组合,以找到计算的总分和预定排名之间的最大化 Spearman 相关性。由于总权重应约为 100%,因此我需要向 DE 添加约束。在阅读了几篇文章后,我的代码是这样的
def spearman(x):
if 0.9999 < sum(x) < 1.0001:
model_score = np.dot(factor, x)
corr = spearmanr(rank, model_score).correlation
return corr
else:
return 999
bound = [(0.00, 0.15), ..., (0.00, 0.15)] # bounds for each weights
res = differential_evolution(spearman, bound)
但是,DE 只运行一次迭代并返回 999 的“成功”结果。感觉 DE 认为 999 是最佳解决方案并停止寻找更好的解决方案。
我尝试了另一种技巧,通过更改目标以同时最小化“Spearman Correlation + abs(total weights - 1)”,并且可以得到正确的答案。但是我还是想用“if-else”的方式来定义约束,直接得到spearman相关性。