Optimization scipy optimize minimize不执行优化-收敛:投影梯度的范数\u\lt=_PGTOL
我试图最小化定义如下的函数:Optimization scipy optimize minimize不执行优化-收敛:投影梯度的范数\u\lt=_PGTOL,optimization,scipy,minimization,scipy-optimize,scipy-optimize-minimize,Optimization,Scipy,Minimization,Scipy Optimize,Scipy Optimize Minimize,我试图最小化定义如下的函数: utility(decision) = decision * (risk - cost) 其中变量采用以下形式: 判定=二进制数组 风险=浮动数组 成本=常数 我知道解决方案将采取以下形式: 如果(风险>=阈值),则决策=1 否则为0 因此,为了最小化此函数,我可以假设我将函数实用程序转换为仅依赖于此阈值。我对scipy的直接翻译如下: def utility(threshold,risk,cost): selection_list = [float(
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])
fun:array([-17750.44298655])hess_inv:
jac:数组([0.])
消息:b'收敛:投影梯度的范数\u错误消息告诉您梯度在某个点太小,因此数值上与零相同。这可能是由于计算选择列表时所做的阈值设置。这里你说的是浮动(风险[i])>=threshold
,几乎所有地方都有导数0。因此,几乎每个起始值都会向您发出警告
解决方案可以是对阈值操作应用一些平滑。因此,您将使用一个连续函数,而不是浮动(风险[i])>=threshold
:
def g(x):
return 1./(1+np.exp(-x))
使用此函数,可以将阈值操作表示为
g((风险[i]-阈值)/a)
,它是一个参数a
。a
越大,修改后的错误函数就越接近您目前所做的操作。大约在a=20
这样的情况下,您可能会得到与当前几乎相同的结果。因此,您将导出一系列解决方案,从a=1
开始,然后将该解决方案作为a=2
相同问题的起始值,将该解决方案作为a=4
问题的起始值,依此类推。在某些时候,您会注意到更改a
不再会更改解决方案,您已经完成了。您定义了实用程序
函数两次。我想你的问题主要是关于第二个,对吗?是的,这是一样的,因为我们在我写的代码中说:效用=决策*(风险-成本):选择\列表=决策v=风险-成本效用=点积{v,选择\列表}(这是乘法元素和和),因此,两个表达式在技术上是相同的。:)