随机搜索和网格搜索以优化函数
? ? ? ? 【翻譯自 : Random Search and Grid Search for Function Optimization】
? ? ?? 【說明:Jason Brownlee?PhD大神的文章個人很喜歡,所以閑暇時間里會做一點翻譯和學習實踐的工作,這里是相應工作的實踐記錄,希望能幫到有需要的人!】
? ? ? ?函數優化需要選擇一種算法,以有效地對搜索空間進行采樣并找到一個好的或最佳的解決方案。有許多算法可供選擇,盡管為哪種類型的解決方案可行或可能解決問題建立基準非常重要。這可以使用簡單的優化算法(例如隨機搜索或網格搜索)來實現。優化算法所獲得的結果在計算上是有效的,可以為更復雜的優化算法生成并提供比較點。有時,發現幼稚算法可以達到最佳性能,尤其是在那些嘈雜或不平滑的問題以及領域專業知識通常會偏重優化算法選擇的那些問題上。
? ? ? 在本教程中,您將發現用于函數優化的簡單算法。完成本教程后,您將知道:
樸素的算法在函數優化項目中的作用。 如何生成和評估函數優化的隨機搜索。 如何生成和評估用于函數優化的網格搜索。教程概述
? ? ? ? 本教程分為三個部分:他們是:
樸素函數優化算法 隨機搜索函數優化 網格搜索函數優化樸素函數優化算法
? ? ? 您可以使用許多不同的算法來進行優化,但是您如何知道所得到的結果是否很好呢?解決此問題的一種方法是使用樸素的優化算法來建立性能基準。樸素的優化算法是一種不假設正在優化的目標函數的算法。它可以非常輕松地應用,并且該算法獲得的最佳結果可以用作比較更復雜算法的參考點。如果更復雜的算法平均不能比單純的算法獲得更好的結果,則它沒有解決您的問題的技巧,應該放棄。
有兩種樸素的算法可用于函數優化。他們是:
隨機搜尋 網格搜索? ? ? 這些算法被稱為“搜索”算法,因為從根本上說,優化可以歸結為搜索問題。例如。找到使目標函數的輸出最小化或最大化的輸入??梢允褂昧硪环N稱為“窮舉搜索”的算法,該算法會枚舉所有可能的輸入。這在實踐中很少使用,因為枚舉所有可能的輸入是不可行的,例如需要太多時間才能運行。但是,如果您發現自己正在處理一個優化問題,可以在合理的時間內對所有輸入進行枚舉和評估,那么這應該是您應該使用的默認策略。
隨機搜索函數優化
? ? ? ?隨機搜索也稱為隨機優化或隨機采樣。隨機搜索涉及生成和評估目標函數的隨機輸入。 之所以有效,是因為它不假設目標函數的結構。 這對于存在很多可能影響或偏向優化策略的領域專業知識的問題可能是有益的,從而可以發現非直觀的解決方案。
? ? ? ?對于搜索空間嘈雜或不平滑(不連續)的區域(可能導致算法依賴可靠梯度)的高度復雜問題,隨機搜索也可能是最佳策略。我們可以使用偽隨機數生成器從域中生成隨機樣本。 每個變量都需要一個明確定義的界限或范圍,并且可以從該范圍中采樣一個統一的隨機值,然后進行評估。生成隨機樣本在計算上是微不足道的,并且不會占用太多內存,因此,生成大量輸入樣本然后進行評估可能是有效的。 每個樣本都是獨立的,因此可以根據需要并行評估樣本以加快流程。下面的示例給出了一個簡單的一維最小化目標函數的示例,然后生成并評估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]))? ? ? ? ?運行示例將生成輸入值的隨機樣本,然后對其進行評估。 然后確定最佳性能點并報告。
? ? ? ? 注意:由于算法或評估程序的隨機性,或者數值精度的不同,您的結果可能會有所不同。 考慮運行該示例幾次并比較平均結果。
? ? ? ? 在這種情況下,我們可以看到結果非常接近于最佳輸入0.0。
Best: f(-0.01762) = 0.00031? ? ? ? 我們可以更新示例以繪制目標函數,并顯示示例和最佳結果。 下面列出了完整的示例。
# 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()? ? ? ? ?再次運行示例將生成隨機樣本并報告最佳結果。
Best: f(0.01934) = 0.00037? ? ? ? ?然后創建一個折線圖,顯示目標函數的形狀,隨機樣本和一條紅線,用于從樣本中找出最佳結果。
網格搜索函數優化
? ? ? ? 網格搜索也稱為網格采樣或全因子采樣。網格搜索涉及為目標函數生成統一的網格輸入。 在一維中,這將是沿一條線均勻分布的輸入。 在二維中,這將是整個表面上均勻間隔的點的晶格,以此類推,以獲取更大的尺寸。
? ? ? ? 像隨機搜索一樣,網格搜索對于通常使用領域專業知識來影響特定優化算法選擇的問題尤其有效。網格可以幫助快速識別可能需要更多注意的搜索空間區域。樣本的網格通常是均勻的,盡管不一定是這種情況。例如,可以使用等距的log-10標度,以允許跨多個數量級執行采樣。不利的一面是,網格的粗糙程度可能會遍及搜索空間中可找到好的解決方案的整個區域,而隨著該問題的輸入數量(搜索空間的維數)增加,該問題將變得更加嚴重。通過選擇點的均勻間隔,然后依次枚舉每個變量,并通過選擇的間隔遞增每個變量,可以生成樣本網格。下面的示例給出了一個簡單的二維最小化目標函數的示例,然后針對兩個輸入變量生成一個間距為0.1的網格樣本。然后報告性能最佳的輸入。
# 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]))? ? ? ? ?運行示例將生成輸入值的網格,然后對其進行評估。 然后確定最佳性能點并報告。
? ? ? ? 注意:由于算法或評估程序的隨機性,或者數值精度的不同,您的結果可能會有所不同。 考慮運行該示例幾次并比較平均結果。
? ? ? ? 在這種情況下,我們可以看到結果精確地找到了最優值。
Best: f(-0.00000,-0.00000) = 0.00000? ? ? ? 我們可以更新示例以繪制目標函數,并顯示示例和最佳結果。 下面列出了完整的示例。
# 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()? ? ? ? 再次運行該示例將生成網格樣本并報告最佳結果。
Best: f(0.00000,0.00000) = 0.00000? ? ? ?然后創建一個等高線圖,顯示目標函數的形狀,網格樣本為黑點,白色星形代表樣本的最佳結果。
? ? ? ?請注意,域邊緣的一些黑點似乎不在繪圖上; 這只是我們如何選擇繪制點的人工產物(例如不在樣品上居中)。
?
?
?
總結
以上是生活随笔為你收集整理的随机搜索和网格搜索以优化函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机文字录入在线打字,汉字输入方法-在
- 下一篇: 查找所引用的文献在某种期刊下的引用格式(