python - 我可以在 Gekko 的中间变量中使用累积分布函数吗?

标签 python normal-distribution gekko

我正在尝试使用 Gekko 解决非线性优化问题,其中我的一个中间变量是使用正态分布的累积分布函数计算的,即 1-CDF(μ,σ, Rs-X),其中 Rs 是另一个Gekko 中间变量和 μ、σ 和 X 是 Gekko 参数/Python 变量。

我还使用 Gekko 的 if3 函数实现了这一点,如果 Rs-X 不是正数,该函数返回数字 1。

    n = len(df_inputs.index)    # rows
    surplus = m.Array(m.Var,(n,1))
    R_sns = m.Array(m.Var,(n,1))
    R_s = m.Array(m.Var,(n,1))
    pi_s = m.Array(m.Var,(n,1))
    for i in range (n):
        surplus[i,0].value =...
        R_sns[i,0].value = m.max3(x,surplus[i,0])
        R_s[i,0].value=m.Intermediate(0.88*R_sns[i,0])
        pi_s[i,0].value = m.if3(R_s[i,0]-x<=0,1,1-norm.cdf(R_s[i,0]-x,df_inputs['Mu'].iloc[i]*0.5,df_inputs['Sigma'].iloc[i]*0.707))

我在上面最后一行代码中收到“TypeError:‘int’类型的对象没有 len()”。这个错误好像是中间变量Rs引起的。我尝试用固定数字替换它,错误消失了。

Traceback (most recent call last): File "solve_v2.py", line 59, in pi_s[i,0].value = m.if3(R_s[i,0]-x<=0,1,1-norm.cdf(R_s[i,0]-x,df_inputs['Mu'].iloc[i]*0.5,df_inputs['Sigma'].iloc[i]*0.707)) ... File "C:\Users\Programs\Python\Python37\lib\site-packages\gekko\gk_operators.py", line 25, in len return len(self.value) File "C:\Users\Programs\Python\Python37\lib\site-packages\gekko\gk_operators.py", line 137, in len return len(self.value) TypeError: object of type 'int' has no len()

如何解决此错误?

最佳答案

出现此错误是因为 norm.cdf 不是 Gekko 函数,无法为基于梯度的求解器提供精确的一阶和二阶导数。如果函数不在 Gekko 中,则有几个选项,例如:(1) 通过请求 Gekko Github 存储库中的功能来请求添加该函数,或者 (2) 创建该函数的近似值。创建 stats.norm.cdf 函数的近似值的一种方法是创建三次样条。下面是一个例子:

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# create cspline of CDF
xp = np.linspace(-5,5,100)
yp = norm.cdf(xp,loc=0,scale=1)
c = GEKKO()
x = c.Var()
y = c.Var()
c.cspline(x,y,xp,yp,True)

# use cspline of CDF in optimization problem
c.Obj((y-0.75)**2)
c.solve(disp=False)

# plot results
plt.figure()
plt.plot(xp,yp,5,'b-')
plt.plot(x.value,y.value,'ro')
plt.ylim([-0.1,1.1])
plt.show()

Cubic spline of Cumulative distribution function

如果样条近似包含两个因变量,则 bspline函数是更好的选择。

上面脚本的另一个问题是使用 Gekko if3功能。您可以省略 <=在你的第一个论点中。如函数帮助中所示,它已被隐含。

        Usage: y = m.if3(condition,x1,x2)
        Inputs:
           condition: GEKKO variable, parameter, or expression
           x1 and x2: GEKKO variable, parameter, or expression
        Output: GEKKO variable y = x1 when condition<0
                               y = x2 when condition>=0

关于python - 我可以在 Gekko 的中间变量中使用累积分布函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56263053/

相关文章:

python - django - 获取模型方法结果的模型字段

python - 壁虎错误 : 2 and -13 showing no solution found

r - 将数据转变为常态。对于给定情况,最佳功能是什么?

r - 拟合对数正态分布或泊松分布

random - 如何在 J 中生成多元正态分布

python - 使用 GEKKO 模拟具有巨大阵列的状态空间方程

gekko - 在 GEKKO 中推导流形上的最佳轨迹

python - 格式为 '%' datetime.strptime 的错误指令

python - Django REST Framework - 每个方法的单独权限

python - 我可以在多进程中启动多线程 flask 吗