<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用 Python 進(jìn)行差分進(jìn)化全局優(yōu)化

          共 6541字,需瀏覽 14分鐘

           ·

          2021-03-21 18:36

          差異進(jìn)化是一種全局優(yōu)化算法。
          它是一種進(jìn)化算法,與其他進(jìn)化算法(例如遺傳算法)有關(guān)。與遺傳算法不同,它是專門設(shè)計(jì)用于對實(shí)值向量(而不是位串)進(jìn)行運(yùn)算的。此外,與遺傳算法不同的是,它使用向量減法和加法等向量運(yùn)算來導(dǎo)航搜索空間,而不是遺傳學(xué)啟發(fā)的變換。
          在本教程中,您將發(fā)現(xiàn)差異演化全局優(yōu)化算法。完成本教程后,您將知道:
          • 差分進(jìn)化優(yōu)化是一種進(jìn)化算法,旨在與實(shí)值候選解一起使用。
          • 如何在python中使用差異進(jìn)化優(yōu)化算法API。
          • 使用差異演化解決具有多個(gè)最優(yōu)解的全局優(yōu)化問題的示例。
          教程概述
          本教程分為三個(gè)部分:他們是:
          • 差異進(jìn)化
          • 差分進(jìn)化API
          • 差分進(jìn)化的工作實(shí)例
          差異進(jìn)化
          差分進(jìn)化,簡稱DE,是一種隨機(jī)的全局搜索優(yōu)化算法。它是一種進(jìn)化算法,與其他進(jìn)化算法(例如遺傳算法)有關(guān)。與使用位序列表示候選解決方案的遺傳算法不同,差分演化被設(shè)計(jì)為與用于連續(xù)目標(biāo)函數(shù)的多維實(shí)值候選解決方案一起使用。
          該算法在搜索中不使用梯度信息,因此非常適合于非微分非線性目標(biāo)函數(shù)。該算法通過維護(hù)代表實(shí)值向量的候選解的總體來工作。通過制作現(xiàn)有解決方案的修改版本來創(chuàng)建新的候選解決方案,然后在算法的每次迭代中替換大部分人口。使用“策略”來創(chuàng)建新的候選解決方案,該策略涉及選擇要添加突變的基本解決方案,以及從總體中計(jì)算出突變的數(shù)量和類型的其他候選解決方案,稱為差異向量。例如,一種策略可以選擇最佳候選解決方案作為突變中差異矢量的基礎(chǔ)和隨機(jī)解決方案。
          如果子級具有更好的目標(biāo)函數(shù)評估,則將基礎(chǔ)解決方案替換為其子級。
          變異計(jì)算為候選解決方案對之間的差異,從而產(chǎn)生差異矢量,然后將差異矢量添加到基本解決方案中,并通過設(shè)置在[0,2]范圍內(nèi)的變異因子超參數(shù)進(jìn)行加權(quán)。
          并非基本解決方案的所有元素都發(fā)生了突變。這是通過重組超參數(shù)控制的,通常將其設(shè)置為較大的值(例如80%),這意味著基本解決方案中的大多數(shù)(但不是全部)變量都將被替換。通過對概率分布(例如二項(xiàng)式或指數(shù)式)進(jìn)行采樣,分別為每個(gè)位置確定保留或替換基本解中的值的決策。
          使用標(biāo)準(zhǔn)術(shù)語來描述以下形式的差異策略:     DE / x / y / z
          DE代表“差分進(jìn)化”,x定義了要變異的基本解,例如“ rand”代表隨機(jī),“ best”代表總體中的最佳解。y代表添加到基本解中的差異向量的數(shù)量,例如1,z定義用于確定每個(gè)解是否在總體中被保留或替換的概率分布,例如用于二項(xiàng)式的“bin”或用于二項(xiàng)式的“ exp”。
          配置DE / best / 1 / binDE / best / 2 / bin是受歡迎的配置,因?yàn)樗鼈冊谠S多目標(biāo)功能上表現(xiàn)良好。既然我們已經(jīng)熟悉了差分進(jìn)化算法,那么讓我們看一下如何使用SciPy API實(shí)現(xiàn)。
          差分進(jìn)化API
          Python中可通過differential_evolution()SciPy函數(shù)使用差分演化全局優(yōu)化算法。該函數(shù)將目標(biāo)函數(shù)的名稱和每個(gè)輸入變量的界限作為搜索的最小參數(shù)。
          # perform the differential evolution search
          result = differential_evolution(objective, bounds)
          盡管可以將它們配置為自定義搜索,但還有許多其他具有默認(rèn)值的搜索超參數(shù)。
          關(guān)鍵的超參數(shù)是控制所執(zhí)行的差異進(jìn)化搜索類型的“策略”參數(shù)。默認(rèn)情況下,將其設(shè)置為“ best1bin”(DE / best / 1 / bin),對于大多數(shù)問題而言,這是一個(gè)很好的配置。它通過從總體中選擇隨機(jī)解,從另一個(gè)中減去一個(gè),然后將差異的縮放版本添加到總體中的最佳候選解中,來創(chuàng)建新的候選解。
          new = best + (mutation * (rand1 – r and2))
          “ popsize”參數(shù)控制總體中維護(hù)的候選解決方案的大小或數(shù)量。它是候選解決方案中維數(shù)的一個(gè)因素,默認(rèn)情況下設(shè)置為15。這意味著對于2D目標(biāo)函數(shù),將維持(2 *15)或30個(gè)候選解決方案的總體大小。
          該算法的迭代總數(shù)由“ maxiter”參數(shù)維護(hù),默認(rèn)為1,000?!白儺悺眳?shù)控制每次迭代對候選解決方案進(jìn)行的更改數(shù)量。默認(rèn)情況下,它設(shè)置為0.5。重組量通過“ recombination”參數(shù)控制,默認(rèn)情況下設(shè)置為0.7(給定候選解決方案的70%)。最后,將本地搜索應(yīng)用于在搜索結(jié)束時(shí)找到的最佳候選解決方案。這是通過“拋光”參數(shù)控制的,默認(rèn)情況下將其設(shè)置為True。搜索的結(jié)果是一個(gè)OptimizeResult對象,可以在其中像字典一樣訪問屬性??梢酝ㄟ^“成功”或“消息”鍵來訪問搜索的成功與否。可以通過“ nfev”訪問功能評估的總數(shù),并且可以通過“ x”鍵訪問為搜索找到的最佳輸入。現(xiàn)在,我們已經(jīng)熟悉了Python中的差異進(jìn)化API,下面我們來看一些可行的示例。
          差分進(jìn)化的工作實(shí)例
          在本節(jié)中,我們將看一個(gè)在具有挑戰(zhàn)性的目標(biāo)函數(shù)上使用差分演化算法的示例。Ackley函數(shù)是目標(biāo)函數(shù)的一個(gè)示例,該目標(biāo)函數(shù)具有單個(gè)全局最優(yōu)值和多個(gè)局部最優(yōu)值,可能會在其中陷入局部搜索。因此,需要全局優(yōu)化技術(shù)。這是一個(gè)二維目標(biāo)函數(shù),其全局最佳值為[0,0],其值為0.0。下面的示例實(shí)現(xiàn)了Ackley,并創(chuàng)建了一個(gè)三維表面圖,顯示了全局最優(yōu)值和多個(gè)局部最優(yōu)值。
          # ackley multimodal function
          from numpy import arange
          from numpy import exp
          from numpy import sqrt
          from numpy import cos
          from numpy import e
          from numpy import pi
          from numpy import meshgrid
          from matplotlib import pyplot
          from mpl_toolkits.mplot3d import Axes3D
           
          # objective function
          def objective(x, y):
           return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
           
          # define range for input
          r_min, r_max = -5.05.0
          # sample input range uniformly at 0.1 increments
          xaxis = arange(r_min, r_max, 0.1)
          yaxis = arange(r_min, r_max, 0.1)
          # create a mesh from the axis
          x, y = meshgrid(xaxis, yaxis)
          # compute targets
          results = objective(x, y)
          # create a surface plot with the jet color scheme
          figure = pyplot.figure()
          axis = figure.gca(projection='3d')
          axis.plot_surface(x, y, results, cmap='jet')
          # show the plot
          pyplot.show()
          運(yùn)行示例將創(chuàng)建Ackley函數(shù)的表面圖,以顯示大量的局部最優(yōu)值。
          首先,我們可以將搜索空間的邊界定義為每個(gè)維度中函數(shù)的極限。
          # define the bounds on the search
          bounds = [[r_min, r_max], [r_min, r_max]]
          然后,我們可以通過指定目標(biāo)函數(shù)的名稱和搜索范圍來應(yīng)用搜索。在這種情況下,我們將使用默認(rèn)的超參數(shù)。
          # perform the differential evolution search
          result = differential_evolution(objective, bounds)
          搜索完成后,它將報(bào)告搜索狀態(tài)和執(zhí)行的迭代次數(shù),以及通過評估發(fā)現(xiàn)的最佳結(jié)果。
          # summarize the result
          print('Status : %s' % result['message'])
          print('Total Evaluations: %d' % result['nfev'])
          # evaluate solution
          solution = result['x']
          evaluation = objective(solution)
          print('Solution: f(%s) = %.5f' % (solution, evaluation))
          結(jié)合在一起,下面列出了將微分進(jìn)化應(yīng)用于Ackley目標(biāo)函數(shù)的完整示例。
          # differential evolution global optimization for the ackley multimodal objective function
          from scipy.optimize import differential_evolution
          from numpy.random import rand
          from numpy import exp
          from numpy import sqrt
          from numpy import cos
          from numpy import e
          from numpy import pi
           
          # objective function
          def objective(v):
           x, y = v
           return -20.0 * exp(-0.2 * sqrt(0.5 * (x**2 + y**2))) - exp(0.5 * (cos(2 * pi * x) + cos(2 * pi * y))) + e + 20
           
          # define range for input
          r_min, r_max = -5.05.0
          # define the bounds on the search
          bounds = [[r_min, r_max], [r_min, r_max]]
          # perform the differential evolution search
          result = differential_evolution(objective, bounds)
          # summarize the result
          print('Status : %s' % result['message'])
          print('Total Evaluations: %d' % result['nfev'])
          # evaluate solution
          solution = result['x']
          evaluation = objective(solution)
          print('Solution: f(%s) = %.5f' % (solution, evaluation))
          運(yùn)行示例將執(zhí)行優(yōu)化,然后報(bào)告結(jié)果。
          注意:由于算法或評估程序的隨機(jī)性,或者數(shù)值精度的差異,您的結(jié)果可能會有所不同。考慮運(yùn)行該示例幾次并比較平均結(jié)果。
          在這種情況下,我們可以看到該算法在輸入為零且目標(biāo)函數(shù)評估為零的情況下定位了最優(yōu)值。
          我們可以看到總共執(zhí)行了3,063個(gè)功能評估。
          Status: Optimization terminated successfully.
          Total Evaluations: 3063
          Solution: f([0. 0.]) = 0.00000


          者:沂水寒城,CSDN博客專家,個(gè)人研究方向:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、NLP、CV

          Blog: http://yishuihancheng.blog.csdn.net


          贊 賞 作 者



          更多閱讀



          2020 年最佳流行 Python 庫 Top 10


          2020 Python中文社區(qū)熱門文章 Top 10


          5分鐘快速掌握 Python 定時(shí)任務(wù)框架

          特別推薦




          點(diǎn)擊下方閱讀原文加入社區(qū)會員

          瀏覽 69
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲第九页 | 91AV久久久 | 美女黄片网站 | ww亚洲 | 欧美日韩国产精品 |