2

我正在尝试使用 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相关性。

4

0 回答 0