Дифференциальная эволюция Scipy не удалась после добавления ограничений - PullRequest
2 голосов
/ 17 января 2020

Я пытаюсь запустить оптимизацию с scipy.optimize.differential_evolution. Я хочу найти лучшую комбинацию весов для примерно 20 переменных, чтобы найти максимизированную корреляцию Спирмена между вычисленным общим счетом и заранее определенным рангом. Поскольку общий вес должен составлять приблизительно 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 лучшим решением и прекращает поиск лучшего один.

Я попробовал другой взлом, изменив цель, чтобы минимизировать «Корреляцию Спирмена + abs (общий вес - 1)» в то же время и могу получить правильный ответ. Но я все еще хочу использовать способ «если-еще», чтобы определить ограничения и напрямую получить корреляцию копья.

...