настроен оптимизатор scipy - PullRequest
0 голосов
/ 19 мая 2018

Я придумал более простой фиктивный пример для моего сценария, возможно, смогу решить мой пример математически вместо использования оптимизатора, но давайте предисловим, я должен использовать оптимизатор.Извините, если слишком многословно.

У меня есть эта функция, которая даст мне результат на основе двух списков, списка весов и списка факторов.

def validate_vector(vector, factors):
    return sum([x * y for x, y in zip(vector, factors)]) 

У меня есть старт3 элемента, но затем я ввожу четвертый элемент.

initial_vector_weights = [.2, .3, .5]
initial_factors = [.09, .07, .01]

new_element_in_vector_weights = [.2, .3, .5, 0]
new_element_factors = [.09, .07, .01, .2]

Каждый раз, когда добавляется новый элемент, я сначала добавляю его с нулевым весом, а затем мне нужно проверить и убедиться, чторезультат моей проверки выше порога 0,05.Если это так, я сохраняю новый элемент с весом 0.

validate_weights(new_element_in_vector_weights, new_element_factors)
0.044

Это новое добавление приводит к проверке ниже 0,05, поэтому я не могу сохранить новый элемент на 0, его необходимо датьвес такой, что моя проверка составляет 0,05.Мне нужно оптимизировать решение, в котором abs (validate_weights (new_element_in_vector_weights, new_element_factors) - .05) = 0.

У меня есть некоторые ограничения, все веса должны быть положительными и должны составлять до 1.

cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1.0},
        {'type': 'ineq', 'fun': lambda x: x})

У меня также есть дополнительное ограничение, я должен оптимизировать его таким образом, чтобы увеличить вес нового элемента (нового 4-го) с 0, но уменьшить свои начальные веса таким образом, чтобы они были пропорциональныисходные.

Например, это может быть решением из моего примера

[.2, .3, .5, 0]
[.18, .27, .45, .1]

, где old / new - это постоянное соотношение, .2 / .18 = .3 / .27= .45 / .5 и я выше .05.

validate_weights([.18, .27, .45, .1], [.09, .07, .01, .2])
0.059600000000000014

Тем не менее, я хочу вес для 4-го элемента, который дает мне ровно 0,05.

Я пытаюсьсделайте это так, но это не сработает.

Это просто гарантирует, что мои веса пропорциональны оригиналу.

def calculate_proportional_weights(original_vector_weights, new_element_weight):
    remaining_weight = 1 - new_element_weight
    proportional_weights = [x * (1-new_element_weight) for x in original_vector_weights[:(len(original_vector_weights) - 1)]]
    return proportional_weights

def prorated_weights_cons(original_weights, new_weights):
    original_weights_core = original_weights[:len(original_weights) - 1]
    new_weights_core = new_weights[:len(new_weights) -1]
    H_new_weight = new_weights[-1]
    redistributed_weights = calculate_proportional_weights(original_weights, H_new_weight)
    return sum(redistributed_weights) + H_new_weight - 1

Это функция, которую я хочу минимизировать.

def min_validate_weights_objective(vector, factors):
    validation_ = validate_vector(vector, factors)
    val_to_min = abs(validation, .05)
    return val_to_min

Это оптимизатор.

cons = ({'type': 'eq', 'fun': prorated_weights_cons(new_element_in_vector_weights, new_element_factors)}, 
 {'type': 'eq', 'fun': lambda x: np.sum(x) - 1.0},
    {'type': 'ineq', 'fun': lambda x: x})

res = minimize(min_validate_weights_objective, new_element_in_vector_weights, args=[new_element_in_vector_weights, new_element_factors], method='SLSQP',constraints=cons, 
              options={'disp': False, 'ftol': .0000000001, 'eps' : .0000000001, 'maxiter':10000})

Этот бомbs, хотя я уверен, что в этом есть что-то не так.

TypeError: 'float' object is not callable

Ребята, вы видите что-то вопиюще неправильное в этой настройке?Большое вам спасибо!

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