Почему scipy.optimize.leastsq дает успешный код возврата, когда переменные, которые он оптимизирует, не изменились? - PullRequest
0 голосов
/ 09 апреля 2019

Я изо всех сил пытался использовать scipy.opt.leastsq, ниже пример игрушки

Сначала вспомогательная функция и начальные переменные:

def calculate_class_ratios(predictions, thresholds):
    predictions[predictions < thresholds] = 0
    predictions[predictions > 0] = 1
    class_counts = predictions.sum(axis=0)
    return class_counts/class_counts.sum()

target_class_ratios = np.array([0.1, 0.9])
predictions = np.array(([[0.6, 0.9]] * 9) + [[0.7, 0.2]])
initial_thresholds = np.array(0.5 * np.ones(2))
optimal_threshold = np.array([0.65, 0.5])

Теперь определите функцию ошибки, ошибкуэто абсолютная разница между вычисляемыми коэффициентами классов с определенным порогом и target_class_ratio:

error = lambda thresholds: np.abs(calculate_class_ratios(copy.deepcopy(predictions), thresholds) - target_class_ratios)
optimized_thresholds, success = opt.leastsq(error, initial_thresholds)

В результате я получаю: optimized_thresholds = np.array([0.5, 0.5])

Таким образом, в результатеРасчетная потеря:

np.abs(calculate_class_ratios(copy.deepcopy(predictions), 
                             optimized_thresholds) - target_class_ratios)
= array([0.42631579, 0.42631579])

Но мы можем найти решение, которое минимизирует ошибку до 0 для каждого порога, установив порог на optimal_threshold:

np.abs(calculate_class_ratios(copy.deepcopy(predictions), 
                             optimal_threshold) - target_class_ratios)
= array([0., 0.])

Am Iничего не хватает?

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