Я пытаюсь минимизировать функцию, определенную следующим образом:
utility(decision) = decision * (risk - cost)
где переменные имеют следующий вид:
решение = двоичный массив
риск = массив чисел с плавающей запятой
стоимость = постоянная
Я знаю, что решение примет форму:
решение = 1 if (риск ›= порог)
решение = 0 в противном случае
Поэтому, чтобы минимизировать эту функцию, я могу предположить, что я преобразую полезность функции, чтобы она зависела только от этого порога. Мой прямой перевод на scipy следующий:
def utility(threshold,risk,cost):
selection_list = [float(risk[i]) >= threshold for i in range(len(risk))]
v = np.array(risk.astype(float)) - cost
total_utility = np.dot(v, selection_list)
return -1.0*total_utility
result = minimize(fun=utility, x0=0.2, args=(r,c),bounds=[(0,1)], options={"disp":True} )
Это дает мне следующий результат:
fun: array([-17750.44298655]) hess_inv: <1x1 LbfgsInvHessProduct with
dtype=float64>
jac: array([0.])
message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
nfev: 2
nit: 0 status: 0 success: True
x: array([0.2])
Однако я знаю, что результат неправильный, потому что в этом случае он должен быть равен cost. Кроме того, независимо от того, какой x0 я использую, он всегда возвращает его как результат. Глядя на результаты, я заметил, что jacobian = 0 и некорректно вычисляет 1 итерацию.
Более подробно изучить функцию. Я рисую его и наблюдаю, что он не выпуклый в пределах границ, но мы ясно видим минимум на 0,1. Однако, как бы я ни настраивал границы, чтобы они находились только в выпуклой части, результат все тот же.
Что я мог сделать, чтобы свести к минимуму эту функцию?
utility
функцию. Полагаю, ваш вопрос в основном касается второго, не так ли? - person Ingo   schedule 17.03.2020