Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization scipy optimize minimize不执行优化-收敛:投影梯度的范数\u\lt=_PGTOL_Optimization_Scipy_Minimization_Scipy Optimize_Scipy Optimize Minimize - Fatal编程技术网

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,选择\列表}(这是乘法元素和和),因此,两个表达式在技术上是相同的。:)