оптимизатор shgo scipy не может минимизировать дисперсию - PullRequest
1 голос
/ 09 июля 2019

Чтобы ознакомиться с методами глобальной оптимизации и, в частности, с оптимизатором shgo из scipy.optimize v1.3.0, я попытался минимизировать дисперсию var(x) вектора x = [x1,...,xN] с помощью 0 <= xi <= 1 при условии, что x имеет заданное среднее значение:

import numpy as np
from scipy.optimize import shgo

# Constraint
avg = 0.5  # Given average value of x
cons = {'type': 'eq', 'fun': lambda x: np.mean(x)-avg}

# Minimize the variance of x under the given constraint
res = shgo(lambda x: np.var(x), bounds=6*[(0, 1)], constraints=cons)

Метод shgo терпит неудачу в этой проблеме:

>>> res
     fun: 0.0
 message: 'Failed to find a feasible minimiser point. Lowest sampling point = 0.0'
    nfev: 65
     nit: 2
   nlfev: 0
   nlhev: 0
   nljev: 0
 success: False
       x: array([0., 0., 0., 0., 0., 0.])

Правильным решением будет равномерное распределение x = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5], и его легко найти, используя локальный оптимизатор minimize из scipy.optimize:

from scipy.optimize import minimize
from numpy.random import random

x0 = random(6)  # Random start vector
res2 = minimize(lambda x: np.var(x), x0, bounds=6*[(0, 1)], constraints=cons)

Метод minimize дает правильный результат для произвольных начальных векторов:

>>> res2.success
True

>>> res2.x
array([0.5, 0.5, 0.5, 0.5, 0.5, 0.5])

Мой вопрос: почему shgo не справляется с этой относительно простой задачей? Я сделал ошибку или shgo просто не подходит для этой проблемы? Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 июля 2019

Очень подробный ответ на этот вопрос был предоставлен Stefan-Endres на странице проекта scipy на github. На этом этапе большое спасибо Stefan-Endres еще раз!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...