国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Scipy優(yōu)化使用教程】二、Scipy中有約束優(yōu)化的兩種算法

這篇具有很好參考價(jià)值的文章主要介紹了【Scipy優(yōu)化使用教程】二、Scipy中有約束優(yōu)化的兩種算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

參考官網(wǎng):Scipy.

對(duì)于有約束的最小化問題,Scipy提供的minimize這個(gè)包有三個(gè):trust-constr, SLSQP'COBYLA。它們要求使用稍微不同的結(jié)構(gòu)來定義約束。
trust-constr需要要求約束被定義成一系列的LinearConstraintNonlinearConstraint兩種類型。
SLSQP'COBYLA需要要求約束條件被定義為一連串的字典,其鍵為type、funjac。
考慮有約束的最小化2個(gè)變量的Rosenbrock函數(shù)
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
這個(gè)問題有唯一解: [ x 0 , x 1 ] = [ 0.4149 , 0.1701 ] [x_0,x_1]=[0.4149,0.1701] [x0?,x1?]=[0.4149,0.1701]。

信賴域約束算法(method=‘trust-constr’)

信任域約束方法處理的是約束性最小化問題,其形式為:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
除此之外,單邊約束可以通過對(duì)np.inf設(shè)置上限或下限并加上適當(dāng)?shù)姆?hào)來指定。

定義邊界約束

邊界限制 0 ≤ x 0 ≤ 1 , ? 0.5 ≤ x 1 ≤ 2.0 0≤x_0≤1,-0.5≤x_1≤2.0 0x0?1,?0.5x1?2.0被定義如下:

from scipy.optimize import Bounds
bounds = Bounds([0, -0.5], [1.0, 2.0])

定義線性約束

約束 x 0 + 2 x 1 ≤ 1 , 2 x 0 + x 1 = 1 x_0+2x_1≤1,2x_0+x_1=1 x0?+2x1?12x0?+x1?=1可以寫成如下形式:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
LinearConstraint去定義:

from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

定義非線性約束

非線性約束為:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
其雅可比矩陣(對(duì)每個(gè)變量求導(dǎo))為:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
黑塞矩陣的線性組合:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
NonlinearConstraint去定義:

#定義非線性約束
def cons_f(x):
    return [x[0]**2 + x[1], x[0]**2 - x[1]]
#定義導(dǎo)數(shù)
def cons_J(x):
    return [[2*x[0], 1], [2*x[0], -1]]
#定義二階導(dǎo)數(shù)
def cons_H(x, v):
    return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
from scipy.optimize import NonlinearConstraint
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)

另外,也可以將Hessian定義為一個(gè)稀疏矩陣。

from scipy.sparse import csc_matrix
def cons_H_sparse(x, v):
    return v[0]*csc_matrix([[2, 0], [0, 0]]) + v[1]*csc_matrix([[2, 0], [0, 0]])
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1,
                                           jac=cons_J, hess=cons_H_sparse)

當(dāng)黑塞矩陣難以計(jì)算的時(shí)候,可以使用HessianUpdateStrategy,目前可用的策略有:BFGSSR1。

from scipy.optimize import BFGS
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=BFGS())

另外,Hessian可以用有限差分法進(jìn)行近似。

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess='2-point')

雅可比矩陣也可以用有限差分法估計(jì),然而,在這種情況下,黑塞不能用有限差分計(jì)算,需要由用戶提供或用之前介紹的HessianUpdateStrategy定義:

nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac='2-point', hess=BFGS())

求解

#設(shè)置初值
x0 = np.array([0.5, 0])
#這個(gè)需要結(jié)合之前無約束的算法來計(jì)算
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
               constraints=[linear_constraint, nonlinear_constraint],
               options={'verbose': 1}, bounds=bounds)
print(res.x)

無約束代碼在這里

`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 8, CG iterations: 7, optimality: 2.99e-09, constraint violation: 0.00e+00, execution time: 0.014 s.
[0.41494531 0.17010937]

完整代碼

import numpy as np
from scipy.optimize import minimize
#無約束
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

def rosen_der(x):
    xm = x[1:-1]
    xm_m1 = x[:-2]
    xm_p1 = x[2:]
    der = np.zeros_like(x)
    der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
    der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
    der[-1] = 200*(x[-1]-x[-2]**2)
    return der
def rosen_hess(x):
    x = np.asarray(x)
    H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
    diagonal = np.zeros_like(x)
    diagonal[0] = 1200*x[0]**2-400*x[1]+2
    diagonal[-1] = 200
    diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
    H = H + np.diag(diagonal)
    return H

#設(shè)置約束
from scipy.optimize import Bounds
bounds = Bounds([0, -0.5], [1.0, 2.0])
from scipy.optimize import LinearConstraint
linear_constraint = LinearConstraint([[1, 2], [2, 1]], [-np.inf, 1], [1, 1])

def cons_f(x):
    return [x[0]**2 + x[1], x[0]**2 - x[1]]
#定義導(dǎo)數(shù)
def cons_J(x):
    return [[2*x[0], 1], [2*x[0], -1]]
#定義二階導(dǎo)數(shù)
def cons_H(x, v):
    return v[0]*np.array([[2, 0], [0, 0]]) + v[1]*np.array([[2, 0], [0, 0]])
from scipy.optimize import NonlinearConstraint
nonlinear_constraint = NonlinearConstraint(cons_f, -np.inf, 1, jac=cons_J, hess=cons_H)

#求解
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='trust-constr', jac=rosen_der, hess=rosen_hess,
               constraints=[linear_constraint, nonlinear_constraint],
               options={'verbose': 1}, bounds=bounds)

print(res.x)

另外也可以對(duì)目標(biāo)函數(shù)的第一和第二導(dǎo)數(shù)進(jìn)行近似,例如,黑塞矩陣可以用SR1準(zhǔn)牛頓法近似,梯度可以用有限差分法近似:

from scipy.optimize import SR1
res = minimize(rosen, x0, method='trust-constr',  jac="2-point", hess=SR1(),
               constraints=[linear_constraint, nonlinear_constraint],
               options={'verbose': 1}, bounds=bounds)
`gtol` termination condition is satisfied.
Number of iterations: 12, function evaluations: 24, CG iterations: 7, optimality: 4.48e-09, constraint violation: 0.00e+00, execution time: 0.02 s.
[0.41494531 0.17010937]

序列最小二乘(SLSQP) (method=‘SLSQP’)

SLSQP需要如下形式:
slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛

設(shè)置約束

slsqp,優(yōu)化求解工具,算法,python,學(xué)習(xí),動(dòng)態(tài)規(guī)劃,自動(dòng)駕駛
線性和非線性約束都被定義為字典,其鍵為type、fun和jac:
首先是定義域:

from scipy.optimize import Bounds
bounds = Bounds([0, -0.5], [1.0, 2.0])

等式與不等式約束:

#不等式約束
ineq_cons = {'type': 'ineq',
             'fun' : lambda x: np.array([1 - x[0] - 2*x[1],
                                         1 - x[0]**2 - x[1],
                                         1 - x[0]**2 + x[1]]),
             #jac是對(duì)fun的求導(dǎo)
             'jac' : lambda x: np.array([[-1.0, -2.0],
                                         [-2*x[0], -1.0],
                                         [-2*x[0], 1.0]])}
#等式約束
eq_cons = {'type': 'eq',
           'fun' : lambda x: np.array([2*x[0] + x[1] - 1]),
           'jac' : lambda x: np.array([2.0, 1.0])}

求解

x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
               constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
               bounds=bounds)
print(res.x)
Optimization terminated successfully    (Exit mode 0)
            Current function value: 0.34271757499419825
            Iterations: 4
            Function evaluations: 5
            Gradient evaluations: 4
[0.41494475 0.1701105 ]

完整代碼

import numpy as np
from scipy.optimize import minimize
#定義無約束的目標(biāo)函數(shù)
def rosen(x):
    """The Rosenbrock function"""
    return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)

def rosen_der(x):
    xm = x[1:-1]
    xm_m1 = x[:-2]
    xm_p1 = x[2:]
    der = np.zeros_like(x)
    der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
    der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
    der[-1] = 200*(x[-1]-x[-2]**2)
    return der
def rosen_hess(x):
    x = np.asarray(x)
    H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
    diagonal = np.zeros_like(x)
    diagonal[0] = 1200*x[0]**2-400*x[1]+2
    diagonal[-1] = 200
    diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
    H = H + np.diag(diagonal)
    return H

#定義約束
from scipy.optimize import Bounds
bounds = Bounds([0, -0.5], [1.0, 2.0])

ineq_cons = {'type': 'ineq',
             'fun' : lambda x: np.array([1 - x[0] - 2*x[1],
                                         1 - x[0]**2 - x[1],
                                         1 - x[0]**2 + x[1]]),
             'jac' : lambda x: np.array([[-1.0, -2.0],
                                         [-2*x[0], -1.0],
                                         [-2*x[0], 1.0]])}
eq_cons = {'type': 'eq',
           'fun' : lambda x: np.array([2*x[0] + x[1] - 1]),
           'jac' : lambda x: np.array([2.0, 1.0])}
           
#求解
x0 = np.array([0.5, 0])
res = minimize(rosen, x0, method='SLSQP', jac=rosen_der,
               constraints=[eq_cons, ineq_cons], options={'ftol': 1e-9, 'disp': True},
               bounds=bounds)

print(res.x)

PS:大部分 trust-constr方法可用的選項(xiàng)對(duì) SLSQP來說是不可用的。文章來源地址http://www.zghlxwxcb.cn/news/detail-788379.html

到了這里,關(guān)于【Scipy優(yōu)化使用教程】二、Scipy中有約束優(yōu)化的兩種算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Scipy 中級(jí)教程——優(yōu)化

    Scipy 提供了多種優(yōu)化算法,用于求解最小化或最大化問題。這些問題可以涉及到擬合模型、參數(shù)優(yōu)化、函數(shù)最優(yōu)化等。在本篇博客中,我們將深入介紹 Scipy 中的優(yōu)化功能,并通過實(shí)例演示如何應(yīng)用這些算法。 1. 單變量函數(shù)最小化 假設(shè)我們有一個(gè)單變量函數(shù),我們想要找到使

    2024年01月21日
    瀏覽(16)
  • 緩存平均的兩種算法

    緩存平均的兩種算法

    引言? ? ? ?? 線邊庫存物料的合理性問題是物流仿真中研究的重要問題之一,如果線邊庫存量過多,則會(huì)對(duì)生產(chǎn)現(xiàn)場(chǎng)的布局產(chǎn)生負(fù)面影響,增加成本,降低效益。 寫在前面 ? ? ? ? 仿真分析后對(duì)線邊Buffer的使用情況進(jìn)行合理的評(píng)估就是一個(gè)非常重要的事情。比較關(guān)心的參數(shù)

    2024年02月13日
    瀏覽(17)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法分析】使用C語言實(shí)現(xiàn)隊(duì)列的兩種(帶頭結(jié)點(diǎn)與不帶頭結(jié)點(diǎn))鏈?zhǔn)酱鎯?chǔ),并且給出一種循環(huán)隊(duì)列的設(shè)計(jì)思想

    【數(shù)據(jù)結(jié)構(gòu)與算法分析】使用C語言實(shí)現(xiàn)隊(duì)列的兩種(帶頭結(jié)點(diǎn)與不帶頭結(jié)點(diǎn))鏈?zhǔn)酱鎯?chǔ),并且給出一種循環(huán)隊(duì)列的設(shè)計(jì)思想

    ??當(dāng)我們編寫程序時(shí),經(jīng)常需要處理各種數(shù)據(jù)結(jié)構(gòu)。隊(duì)列是一種常見的數(shù)據(jù)結(jié)構(gòu),它有著廣泛的應(yīng)用場(chǎng)景。隊(duì)列的基本操作包括入隊(duì)和出隊(duì),應(yīng)用于模擬等待隊(duì)列、消息隊(duì)列、計(jì)算機(jī)緩存等場(chǎng)合。 ??在實(shí)際編程中,我們可以用不同的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)隊(duì)列。本文主要介紹了

    2024年02月08日
    瀏覽(503)
  • Unity3D教程:播放視頻的兩種方式

    Unity3D教程:播放視頻的兩種方式

    Unity3D 中播放游戲視頻的方式有兩種,第一種是在游戲?qū)ο笾胁シ?,就好比在游戲世界中?chuàng)建一個(gè)Plane面對(duì)象,攝像機(jī)直直的照射在這個(gè)面上。第二種是在GUI層面上播放視頻。播放視頻其實(shí)和貼圖非常相像,因?yàn)椴シ乓曨l用到的MovieTexture屬于貼圖Texture的子類,那么本章我們就

    2024年02月11日
    瀏覽(26)
  • 關(guān)鍵詞提取 | 基于Textrank算法的兩種關(guān)鍵詞提取

    關(guān)鍵詞提取 | 基于Textrank算法的兩種關(guān)鍵詞提取

    目錄 一、PageRank算法 二、TextRank算法 1. 抽?。╧eyword extraction) 2. 關(guān)鍵短語抽?。╧eyphrase extration) 3. 關(guān)鍵句抽?。╯entence extraction) 三、TextRank算法實(shí)現(xiàn) 1. 基于Textrank4zh的TextRank算法實(shí)現(xiàn) 2. 基于jieba的TextRank算法實(shí)現(xiàn) 3.?基于SnowNLP的TextRank算法實(shí)現(xiàn) 四、PageRank算法與Text

    2024年04月14日
    瀏覽(45)
  • Jenkins安裝插件教程 牢記 Jenkis安裝插件(plugin)的兩種方法

    Jenkins安裝插件教程 牢記 Jenkis安裝插件(plugin)的兩種方法

    目錄 jenkins在線安裝組件(plugin) jenkins離線安裝組件(plugin) ????????前言:在jenkins學(xué)習(xí)使用或使用的過程中,由于網(wǎng)絡(luò)的問題,在選擇安裝插件的時(shí)候,會(huì)出現(xiàn)某些插件安裝失敗。這是需要重新安裝(可以選擇在線或者離線安裝)或者在工作的過程中,部署在jenkins的

    2024年02月16日
    瀏覽(19)
  • 操作教程|在MeterSphere中通過SSH登錄服務(wù)器的兩種方法

    操作教程|在MeterSphere中通過SSH登錄服務(wù)器的兩種方法

    MeterSphere開源持續(xù)測(cè)試平臺(tái)擁有非常強(qiáng)大的插件集成機(jī)制,用戶可以通過插件實(shí)現(xiàn)平臺(tái)能力的拓展,借助插件或腳本實(shí)現(xiàn)多種功能。在測(cè)試過程中,測(cè)試人員有時(shí)需要通過SSH協(xié)議登錄至服務(wù)器,以獲取某些配置文件和日志文件,或者啟動(dòng)其他服務(wù)、執(zhí)行腳本等,MeterSphere平臺(tái)提

    2024年04月09日
    瀏覽(18)
  • C++ 實(shí)現(xiàn)定時(shí)器的兩種方法(線程定時(shí)和時(shí)間輪算法修改版)

    定時(shí)器要求在固定的時(shí)間異步執(zhí)行一個(gè)操作,比如boost庫中的boost::asio::deadline_timer,以及MFC中的定時(shí)器。也可以利用c++11的thread, mutex, condition_variable 來實(shí)現(xiàn)一個(gè)定時(shí)器。 1、使用C++11中的thread, mutex, condition_variable來實(shí)現(xiàn)一個(gè)定時(shí)器。 注:此算法會(huì)每一個(gè)任務(wù)創(chuàng)建一個(gè)線程,不推

    2024年02月05日
    瀏覽(28)
  • 機(jī)器學(xué)習(xí)筆記之優(yōu)化算法(一)無約束優(yōu)化概述

    機(jī)器學(xué)習(xí)筆記之優(yōu)化算法(一)無約束優(yōu)化概述

    從本節(jié)開始,將介紹 優(yōu)化算法 ( Optimization?Algorithm ) (text{Optimization Algorithm}) ( Optimization?Algorithm ) 。 基于支持向量機(jī) ( Support?Vector?Machine,SVM ) (text{Support Vector Machine,SVM}) ( Support?Vector?Machine,SVM ) 最大間隔分類器 的樸素思想: 從能夠?qū)⑺袠颖军c(diǎn) 正確分類 的直線中找到 滿足

    2024年02月15日
    瀏覽(21)
  • 寶塔面板綁定域名之后無法登錄的兩種解決方法【圖文教程親測(cè)有效】

    寶塔面板綁定域名之后無法登錄的兩種解決方法【圖文教程親測(cè)有效】

    手賤,點(diǎn)擊了綁定域名,保存后直接報(bào)錯(cuò)了!! 為面板綁定一個(gè)訪問域名,注意:一旦綁定域名,只能通過域名訪問面板 報(bào)錯(cuò)如下: 去云服務(wù)器后臺(tái),使用命令: 使用命令 rm -f /www/server/panel/data/domain.conf 刪除綁定域名后,就能用ip+端口進(jìn)入面板了` 是的,就是沒有備案導(dǎo)致的

    2024年02月12日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包