我试图最小化定义如下的函数:
utility(decision) = decision * (risk - cost)
其中变量采用以下形式:
决策 = 二进制数组
风险 = 浮点数数组
成本=常数
我知道解决方案将采取以下形式:
决定=1如果(风险 >= 阈值)
决定 = 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。但是,无论我如何将边界调整为仅在凸部分,结果仍然相同。
我可以做什么来最小化这个功能?