簡體   English   中英

如何在 Gekko Python 中簡化大規模 NLP 模型?

[英]How can I simplify a large scale NLP model in Gekko Python?

我還是 Python 中的 Gekko 優化的新手,我在擴展我的 NLP 問題時遇到了問題。 在嘗試多次(並以不同的方式)調用函數 m.Sum、使用 m.Intermediate 並使用列表推導來減小表示我的模型的字符串的大小后,我在嘗試優化僅有 200 個變量。 當我僅針對 80 個變量進行優化時,該模型有效。

這是我得到的錯誤:

APM model error: string > 15000  characters
 Consider breaking up the line into multiple equations

 The may also be due to only using newline character CR
   instead of CR LF (for Windows) or LF (for MacOS/Linux)
 To fix this problem, save APM file with appropriate newline characters

 STOPPING...

這是讓我遇到麻煩的代碼片段:

def function_to_minimize(variables0,m):
    somme = [ m.Intermediate(
                    variables0[0+(4*i)] * df['value1'][i] + \
                    variables0[1+(4*i)] * df['value2'][i] + \
                    variables0[2+(4*i)] * df['value3'][i] + \
                    variables0[3+(4*i)] * df['value4'][i]
     ) for i in range(0,hours)] 

    somme = reduce(lambda a, b: a+b, somme)
    m.Obj(m.Intermediate(somme))

嘗試多次調用m.Obj()而不是創建總和。 下面是一個演示該問題的最小完整問題。 如果v = m.Array(m.Var,100,lb=0,ub=10)是一個包含更多變量的數組,則可以達到 15,000 個方程長度限制。

from gekko import GEKKO
m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24
def function_to_minimize(variables0,m):
    somme = [ m.Intermediate(
                    variables0[0+(4*i)] * 1 + \
                    variables0[1+(4*i)] * 2 + \
                    variables0[2+(4*i)] * 3 + \
                    variables0[3+(4*i)] * 4
     ) for i in range(0,hours)] 
    somme = sum(somme)
    m.Minimize(m.Intermediate(somme))
function_to_minimize(v,m)
m.solve()

使用m.sum()來避免限制。

from gekko import GEKKO

m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24

def function_to_minimize(variables0,m):
    somme = [ m.Intermediate(
                    variables0[0+(4*i)] * 1 + \
                    variables0[1+(4*i)] * 2 + \
                    variables0[2+(4*i)] * 3 + \
                    variables0[3+(4*i)] * 4
     ) for i in range(0,hours)] 

    m.Minimize(m.sum(somme))
function_to_minimize(v,m)
m.solve()

或使用[m.Minimize(s) for s in somme]分別為每個元素調用m.Obj()m.Minimize()

from gekko import GEKKO

m = GEKKO()
v = m.Array(m.Var,100,lb=0,ub=10)
hours = 24

def function_to_minimize(variables0,m):
    somme = [ m.Intermediate(
                    variables0[0+(4*i)] * 1 + \
                    variables0[1+(4*i)] * 2 + \
                    variables0[2+(4*i)] * 3 + \
                    variables0[3+(4*i)] * 4
     ) for i in range(0,hours)] 

    [m.Minimize(s) for s in somme]
function_to_minimize(v,m)
m.solve()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM