随机搜索和网格搜索以优化函数
? ? ? ? 【翻譯自 : Random Search and Grid Search for Function Optimization】
? ? ?? 【說明:Jason Brownlee?PhD大神的文章個人很喜歡,所以閑暇時間里會做一點翻譯和學習實踐的工作,這里是相應工作的實踐記錄,希望能幫到有需要的人!】
? ? ? ?函數(shù)優(yōu)化需要選擇一種算法,以有效地對搜索空間進行采樣并找到一個好的或最佳的解決方案。有許多算法可供選擇,盡管為哪種類型的解決方案可行或可能解決問題建立基準非常重要。這可以使用簡單的優(yōu)化算法(例如隨機搜索或網(wǎng)格搜索)來實現(xiàn)。優(yōu)化算法所獲得的結(jié)果在計算上是有效的,可以為更復雜的優(yōu)化算法生成并提供比較點。有時,發(fā)現(xiàn)幼稚算法可以達到最佳性能,尤其是在那些嘈雜或不平滑的問題以及領(lǐng)域?qū)I(yè)知識通常會偏重優(yōu)化算法選擇的那些問題上。
? ? ? 在本教程中,您將發(fā)現(xiàn)用于函數(shù)優(yōu)化的簡單算法。完成本教程后,您將知道:
樸素的算法在函數(shù)優(yōu)化項目中的作用。 如何生成和評估函數(shù)優(yōu)化的隨機搜索。 如何生成和評估用于函數(shù)優(yōu)化的網(wǎng)格搜索。教程概述
? ? ? ? 本教程分為三個部分:他們是:
樸素函數(shù)優(yōu)化算法 隨機搜索函數(shù)優(yōu)化 網(wǎng)格搜索函數(shù)優(yōu)化樸素函數(shù)優(yōu)化算法
? ? ? 您可以使用許多不同的算法來進行優(yōu)化,但是您如何知道所得到的結(jié)果是否很好呢?解決此問題的一種方法是使用樸素的優(yōu)化算法來建立性能基準。樸素的優(yōu)化算法是一種不假設(shè)正在優(yōu)化的目標函數(shù)的算法。它可以非常輕松地應用,并且該算法獲得的最佳結(jié)果可以用作比較更復雜算法的參考點。如果更復雜的算法平均不能比單純的算法獲得更好的結(jié)果,則它沒有解決您的問題的技巧,應該放棄。
有兩種樸素的算法可用于函數(shù)優(yōu)化。他們是:
隨機搜尋 網(wǎng)格搜索? ? ? 這些算法被稱為“搜索”算法,因為從根本上說,優(yōu)化可以歸結(jié)為搜索問題。例如。找到使目標函數(shù)的輸出最小化或最大化的輸入。可以使用另一種稱為“窮舉搜索”的算法,該算法會枚舉所有可能的輸入。這在實踐中很少使用,因為枚舉所有可能的輸入是不可行的,例如需要太多時間才能運行。但是,如果您發(fā)現(xiàn)自己正在處理一個優(yōu)化問題,可以在合理的時間內(nèi)對所有輸入進行枚舉和評估,那么這應該是您應該使用的默認策略。
隨機搜索函數(shù)優(yōu)化
? ? ? ?隨機搜索也稱為隨機優(yōu)化或隨機采樣。隨機搜索涉及生成和評估目標函數(shù)的隨機輸入。 之所以有效,是因為它不假設(shè)目標函數(shù)的結(jié)構(gòu)。 這對于存在很多可能影響或偏向優(yōu)化策略的領(lǐng)域?qū)I(yè)知識的問題可能是有益的,從而可以發(fā)現(xiàn)非直觀的解決方案。
? ? ? ?對于搜索空間嘈雜或不平滑(不連續(xù))的區(qū)域(可能導致算法依賴可靠梯度)的高度復雜問題,隨機搜索也可能是最佳策略。我們可以使用偽隨機數(shù)生成器從域中生成隨機樣本。 每個變量都需要一個明確定義的界限或范圍,并且可以從該范圍中采樣一個統(tǒng)一的隨機值,然后進行評估。生成隨機樣本在計算上是微不足道的,并且不會占用太多內(nèi)存,因此,生成大量輸入樣本然后進行評估可能是有效的。 每個樣本都是獨立的,因此可以根據(jù)需要并行評估樣本以加快流程。下面的示例給出了一個簡單的一維最小化目標函數(shù)的示例,然后生成并評估100個輸入的隨機樣本。 然后報告性能最佳的輸入。
# example of random search for function optimization from numpy.random import rand# objective function def objective(x):return x**2.0# define range for input r_min, r_max = -5.0, 5.0 # generate a random sample from the domain sample = r_min + rand(100) * (r_max - r_min) # evaluate the sample sample_eval = objective(sample) # locate the best solution best_ix = 0 for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i # summarize best solution print('Best: f(%.5f) = %.5f' % (sample[best_ix], sample_eval[best_ix]))? ? ? ? ?運行示例將生成輸入值的隨機樣本,然后對其進行評估。 然后確定最佳性能點并報告。
? ? ? ? 注意:由于算法或評估程序的隨機性,或者數(shù)值精度的不同,您的結(jié)果可能會有所不同。 考慮運行該示例幾次并比較平均結(jié)果。
? ? ? ? 在這種情況下,我們可以看到結(jié)果非常接近于最佳輸入0.0。
Best: f(-0.01762) = 0.00031? ? ? ? 我們可以更新示例以繪制目標函數(shù),并顯示示例和最佳結(jié)果。 下面列出了完整的示例。
# example of random search for function optimization with plot from numpy import arange from numpy.random import rand from matplotlib import pyplot# objective function def objective(x):return x**2.0# define range for input r_min, r_max = -5.0, 5.0 # generate a random sample from the domain sample = r_min + rand(100) * (r_max - r_min) # evaluate the sample sample_eval = objective(sample) # locate the best solution best_ix = 0 for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i # summarize best solution print('Best: f(%.5f) = %.5f' % (sample[best_ix], sample_eval[best_ix])) # sample input range uniformly at 0.1 increments inputs = arange(r_min, r_max, 0.1) # compute targets results = objective(inputs) # create a line plot of input vs result pyplot.plot(inputs, results) # plot the sample pyplot.scatter(sample, sample_eval) # draw a vertical line at the best input pyplot.axvline(x=sample[best_ix], ls='--', color='red') # show the plot pyplot.show()? ? ? ? ?再次運行示例將生成隨機樣本并報告最佳結(jié)果。
Best: f(0.01934) = 0.00037? ? ? ? ?然后創(chuàng)建一個折線圖,顯示目標函數(shù)的形狀,隨機樣本和一條紅線,用于從樣本中找出最佳結(jié)果。
網(wǎng)格搜索函數(shù)優(yōu)化
? ? ? ? 網(wǎng)格搜索也稱為網(wǎng)格采樣或全因子采樣。網(wǎng)格搜索涉及為目標函數(shù)生成統(tǒng)一的網(wǎng)格輸入。 在一維中,這將是沿一條線均勻分布的輸入。 在二維中,這將是整個表面上均勻間隔的點的晶格,以此類推,以獲取更大的尺寸。
? ? ? ? 像隨機搜索一樣,網(wǎng)格搜索對于通常使用領(lǐng)域?qū)I(yè)知識來影響特定優(yōu)化算法選擇的問題尤其有效。網(wǎng)格可以幫助快速識別可能需要更多注意的搜索空間區(qū)域。樣本的網(wǎng)格通常是均勻的,盡管不一定是這種情況。例如,可以使用等距的log-10標度,以允許跨多個數(shù)量級執(zhí)行采樣。不利的一面是,網(wǎng)格的粗糙程度可能會遍及搜索空間中可找到好的解決方案的整個區(qū)域,而隨著該問題的輸入數(shù)量(搜索空間的維數(shù))增加,該問題將變得更加嚴重。通過選擇點的均勻間隔,然后依次枚舉每個變量,并通過選擇的間隔遞增每個變量,可以生成樣本網(wǎng)格。下面的示例給出了一個簡單的二維最小化目標函數(shù)的示例,然后針對兩個輸入變量生成一個間距為0.1的網(wǎng)格樣本。然后報告性能最佳的輸入。
# example of grid search for function optimization from numpy import arange from numpy.random import rand# objective function def objective(x, y):return x**2.0 + y**2.0# define range for input r_min, r_max = -5.0, 5.0 # generate a grid sample from the domain sample = list() step = 0.1 for x in arange(r_min, r_max+step, step):for y in arange(r_min, r_max+step, step):sample.append([x,y]) # evaluate the sample sample_eval = [objective(x,y) for x,y in sample] # locate the best solution best_ix = 0 for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i # summarize best solution print('Best: f(%.5f,%.5f) = %.5f' % (sample[best_ix][0], sample[best_ix][1], sample_eval[best_ix]))? ? ? ? ?運行示例將生成輸入值的網(wǎng)格,然后對其進行評估。 然后確定最佳性能點并報告。
? ? ? ? 注意:由于算法或評估程序的隨機性,或者數(shù)值精度的不同,您的結(jié)果可能會有所不同。 考慮運行該示例幾次并比較平均結(jié)果。
? ? ? ? 在這種情況下,我們可以看到結(jié)果精確地找到了最優(yōu)值。
Best: f(-0.00000,-0.00000) = 0.00000? ? ? ? 我們可以更新示例以繪制目標函數(shù),并顯示示例和最佳結(jié)果。 下面列出了完整的示例。
# example of grid search for function optimization with plot from numpy import arange from numpy import meshgrid from numpy.random import rand from matplotlib import pyplot# objective function def objective(x, y):return x**2.0 + y**2.0# define range for input r_min, r_max = -5.0, 5.0 # generate a grid sample from the domain sample = list() step = 0.5 for x in arange(r_min, r_max+step, step):for y in arange(r_min, r_max+step, step):sample.append([x,y]) # evaluate the sample sample_eval = [objective(x,y) for x,y in sample] # locate the best solution best_ix = 0 for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i # summarize best solution print('Best: f(%.5f,%.5f) = %.5f' % (sample[best_ix][0], sample[best_ix][1], sample_eval[best_ix])) # 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 filled contour plot pyplot.contourf(x, y, results, levels=50, cmap='jet') # plot the sample as black circles pyplot.plot([x for x,_ in sample], [y for _,y in sample], '.', color='black') # draw the best result as a white star pyplot.plot(sample[best_ix][0], sample[best_ix][1], '*', color='white') # show the plot pyplot.show()? ? ? ? 再次運行該示例將生成網(wǎng)格樣本并報告最佳結(jié)果。
Best: f(0.00000,0.00000) = 0.00000? ? ? ?然后創(chuàng)建一個等高線圖,顯示目標函數(shù)的形狀,網(wǎng)格樣本為黑點,白色星形代表樣本的最佳結(jié)果。
? ? ? ?請注意,域邊緣的一些黑點似乎不在繪圖上; 這只是我們?nèi)绾芜x擇繪制點的人工產(chǎn)物(例如不在樣品上居中)。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的随机搜索和网格搜索以优化函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机文字录入在线打字,汉字输入方法-在
- 下一篇: 查找所引用的文献在某种期刊下的引用格式(