Я пытаюсь запустить оптимизацию с 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)» в то же время и могу получить правильный ответ. Но я все еще хочу использовать способ «если-еще», чтобы определить ограничения и напрямую получить корреляцию копья.