簡體   English   中英

Gekko:獲取解決方案的問題(離線,Solver=1、2 或 3)或在合理的時間(在線,遠程=True)

[英]Gekko: Problem with obtaining the solution (offline, Solver=1, 2, or 3) or in a reasonable time (online, remote=True)

下面的簡單優化模型(支持向量機,請參閱https://www.supplychaindataanalytics.com/creating-a-support-vector-machine-using-gekko-in-python/了解更多信息)是一個帶有 T= 的 NLP 86 和 U=6(為此最小工作示例生成的數據集)。

import numpy as np
import gekko as op
import itertools as it

a = np.random.rand(86, 6)
b = np.random.randint(0,6, size=(86))

C = range(len(set(b))) #Set of classes
U = range(len(a[0]))  #Set of input features
T = range(len(b)) #Set of the training points

def model (C,U,T,a,b,solve="y"):
    save_b = tuple(b)
    alpha_c=[None for j in C]
    z_c=[None for j in C]
    for j in C:
        for t in T:
            if b[t] == j:
                b[t] = +1
            else:
                b[t] = -1
        print(b)
        m = op.GEKKO(remote=False, name='SupportVectorMachine') 
        alpha = {t: m.Var(lb=0, ub=None) for t in T}
        n_a = {(t,i): a[t][i] for t,i in it.product(T,U)}
        n_b = {t: b[t] for t in T}  
        objs = {0: m.sum([alpha[t] for t in T]) - 0.5*m.sum([alpha[t]*alpha[tt] * n_b[t]*n_b[tt] * m.sum([n_a[(t,i)]*n_a[(tt,i)] for i in U]) for t,tt in it.product(T,T)])}
        cons = {0: {0: ( m.sum([alpha[t]*n_b[t] for t in T]) == 0) for t in T}}
        m.Maximize(objs[0])
        for keys1 in cons:
            for keys2 in cons[keys1]: m.Equation(cons[keys1][keys2])   
        if solve == "y":
            m.options.SOLVER=1
            m.solve(disp=False)
            for keys in alpha: 
                alpha[keys] =  alpha[keys].value[0]
                print(f"alpha[{keys}]", alpha[keys])
        x = [None for i in U]
        for i in U:
            x[i]=sum(alpha[t]*b[t]*n_a[(t,i)] for t in T)
        for t in T:
            if alpha[t]>0: 
                z=b[t] - sum(x[i]*n_a[(t,i)] for i in U)
                break
        b = list(save_b)
        alpha_c[j]=alpha
        z_c[j]=z
    return m,z,alpha

m, z, alpha = model(C,U,T,a,b) #Model and solve the problem

使用m.options.SOLVER=1 ,代碼退出:

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\USERNAME\\AppData\\Local\\Temp\\tmpj66p0g5qsupportvectormachine\\options.json'

使用m.options.SOLVER=2 ,代碼退出:

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\USERNAME\\AppData\\Local\\Temp\\tmpgat29b25supportvectormachine\\options.json'

使用m.options.SOLVER=3 ,代碼退出:

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\USERNAME\\AppData\\Local\\Temp\\tmpgat29b25supportvectormachine\\options.json'

使用m = op.GEKKO(remote=True, name='SupportVectorMachine')代碼似乎需要太多時間來運行並且沒有報告輸出。

我想知道為什么會發生這種情況以及如何對代碼進行故障排除? 我們是否需要每次都為求解器的算法提供初始猜測? (我正在使用gekko (1.21.5) 。)提前致謝。

ٍ編輯:在 Google 的 Colaboratory 上,它以:

Exception: @error: Solution Not Found

嘗試IMODE=2回歸模式),其中模型僅定義一次並自動應用於每個數據點。 這大大提高了模型編譯的速度。 下面是 IMODE=2 的最小示例。 對於同一示例和 非線性回歸示例,還可以與 Scipy Minimize 進行比較

import numpy as np
from gekko import GEKKO
# load data
xm = np.array([18.3447,79.86538,85.09788,10.5211,44.4556, \
               69.567,8.960,86.197,66.857,16.875, \
               52.2697,93.917,24.35,5.118,25.126, \
               34.037,61.4445,42.704,39.531,29.988])
ym = np.array([5.072,7.1588,7.263,4.255,6.282, \
               6.9118,4.044,7.2595,6.898,4.8744, \
               6.5179,7.3434,5.4316,3.38,5.464, \
               5.90,6.80,6.193,6.070,5.737])
# define model
m = GEKKO()
# one value across all data
a,b,c = m.Array(m.FV,3,value=0)
c.LOWER = -100; c.UPPER = 100
# load data
x = m.Param(value=xm)
ymeas = m.Param(value=ym)
# predicted value
ypred = m.Var()
a.STATUS = 1; b.STATUS = 1; c.STATUS = 1
m.Equation(ypred == a + b/x + c*m.log(x))
m.Minimize(((ypred-ymeas)/ymeas)**2)
m.options.IMODE = 2   # regression mode
m.solve() # remote=False for local solve
print('Final SSE Objective: ' + str(m.options.objfcnval))

代碼中還有一些可以提高性能的東西。

  1. 目標函數中的m.sum([n_a[(t,i)]*n_a[(tt,i)] for i in U])可以用常規求和替換為sum([n_a[(t,i)]*n_a[(tt,i)] for i in U]) 當所有參數都是浮點數時,這允許評估值而不是求和的 Gekko 符號形式。

  2. 是否可以cons一次(維度T )而不是重復相同的約束(維度T*T )?

        cons = {0: m.sum([alpha[t]*n_b[t] for t in T]) == 0}
        m.Maximize(objs[0])
        for keys1 in cons:
            m.Equation(cons[keys1])

感謝您發布 SVM 代碼。 如果可以將其轉換為IMODE=2 ,則可以大大提高解決方案的效率。 如果不可能(保持IMODE=3默認值),那么希望上述建議有所幫助。

我們正在 Gekko 中開發一個新模塊,以將sklearnsklearn 示例)、 tensorflowgpflow和其他模型導入 Gekko。 潛力是使用那些特制的回歸包並將模型導出到更通用的優化gekko包。 我們發現,當只需要一階導數時,通過提供具有稀疏一階和二階導數的約束和目標的自動微分,一般的基於梯度的求解器可能在擬合中做太多工作。 為每種回歸方法專門設計的優化器可能會更有效,尤其是對於在 GPU 上訓練的大型數據集。 預計 2022 年 9 月左右在 Gekko v1.1+的下一個版本中會出現更多文檔和結果。

暫無
暫無

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

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