【翻译: randomsearchandgridsearchforfunctionoptimization】
【说明】因为我个人比较喜欢Jason BrownleePhD大神的文章,所以在空闲的时候做一点学习翻译和实践的工作。 这里是相应工作的实践记录。 希望能对有需要的人有帮助。 】
在函数优化中,需要有效地对搜索空间进行采样,选择好的或最佳的解决方案的算法。 尽管为可能的解决方案类型或可能解决问题创建基准非常重要,但有许多算法可供选择。 这可以使用简单的优化算法(如随机搜索和网格搜索)来实现。 由优化算法得到的结果在计算上是有效的,可以产生并提供更复杂的优化算法的比较点。 幼稚算法可能无法达到最佳性能,特别是在吵闹问题、不流畅问题以及领域专业知识偏向于选择优化算法的问题上。
本教程介绍了用于优化函数的简单算法。 完成本教程后,您将发现:
朴素算法在函数优化项目中的作用。 如何生成和评估函数优化的随机搜索。 如何生成和评估用于函数优化的网格搜索。 教程概述本教程分为三个部分。 他们如下。
朴素函数优化算法随机搜索函数优化网格搜索函数优化朴素函数优化算法可以使用很多不同的算法进行优化,你知道如何得到好的结果吗? 解决这个问题的一个方法是使用朴素的优化算法创建性能基准。 朴素优化算法是一种不假设优化中目标函数的算法。 非常容易应用,该算法得到的最佳结果可以作为更复杂算法的基准点。 如果更复杂的算法平均不能比简单的算法获得更好的结果,就必须放弃,因为没有解决问题的技术。
函数优化有两种朴素的算法。 他们说:
随机搜索网格搜索这些算法被称为“搜索”算法。 因为基本上,优化可以归结为搜索问题。 例如。 找到最小化或最大化目标函数输出的输入。 可以使用另一种算法,称为“穷举搜索”。 该算法枚举所有可能的输入。 这在实践中很少使用,因为不可能列举所有可能的输入,例如执行时间太长。 但是,如果您正在处理可以在合理时间内枚举和评估所有输入的优化问题,则这必须是默认策略。
随机搜索函数优化随机搜索也称为随机优化或随机采样。 随机搜索包括生成和评估目标函数的随机输入。 之所以有效,是因为不假设目标函数的结构。 对于存在大量可能影响或偏向优化策略的领域专业知识的问题,这是有益的,并且可能会找到不直观的解决方案。
随机搜索对于搜索高噪声区域和不光滑(不连续)区域、算法可能依赖于可靠梯度的高度复杂问题也可能是最佳策略。 可以使用伪随机数生成器从域中生成随机样本。 每个变量都需要一个明确定义的边界或范围,可以从该范围中采样并评估统一的随机值。 由于生成随机样本在计算上是微不足道的并且很少消耗存储器,因此生成和评估大量输入样本可能是有效的。 每个样本都是独立的,因此可以根据需要并行评估样本以加快过程。 此示例说明一个简单的一维最小化目标函数示例,它生成并评估100个输入随机样本。 然后报告性能最好的输入。
# exampleofrandomsearchforfunctionoptimizationfromnumpy.randomimportrand # objectivefunctiondefobjective (x ) 3360 returnx defobjd r_max=-5.0, 5.0 # generatearandomsamplefromthedomainsample=r _ min rand (100 ) * ((r_max-r_min ) evaluatethesamplesample_eer ) ) ) ) generate a locatethebestsolutionbest _ IX=0forinrange sample _ eval [ best _ IX ] 330 summarizebestsolutionprint (best : f (%.5f )=%.5f ) % ) sample[best_IX],samamp 然后,确定并报告最佳性能点。
注:结果可能因算法或评估程序的随机性或数值精度而异。 考虑运行几次此示例并比较平均结果。
在这种情况下,可以看到结果非常接近最佳输入0.0。
best:f(-0.01762 )=0.00031可以绘制所需的函数,并更新示例以显示示例和最佳结果。 以下是完整的示例。
# exampleofrandomsearchforfunctionoptimizationwithplotfromnumpyimportarangefromnu
mpy.random import randfrom matplotlib import pyplot# objective functiondef objective(x):return x**2.0# define range for inputr_min, r_max = -5.0, 5.0# generate a random sample from the domainsample = r_min + rand(100) * (r_max – r_min)# evaluate the samplesample_eval = objective(sample)# locate the best solutionbest_ix = 0for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i# summarize best solutionprint(‘Best: f(%.5f) = %.5f’ % (sample[best_ix], sample_eval[best_ix]))# sample input range uniformly at 0.1 incrementsinputs = arange(r_min, r_max, 0.1)# compute targetsresults = objective(inputs)# create a line plot of input vs resultpyplot.plot(inputs, results)# plot the samplepyplot.scatter(sample, sample_eval)# draw a vertical line at the best inputpyplot.axvline(x=sample[best_ix], ls=’–‘, color=’red’)# show the plotpyplot.show()
再次运行示例将生成随机样本并报告最佳结果。
Best: f(0.01934) = 0.00037
然后创建一个折线图,显示目标函数的形状,随机样本和一条红线,用于从样本中找出最佳结果。
网格搜索函数优化
网格搜索也称为网格采样或全因子采样。网格搜索涉及为目标函数生成统一的网格输入。 在一维中,这将是沿一条线均匀分布的输入。 在二维中,这将是整个表面上均匀间隔的点的晶格,以此类推,以获取更大的尺寸。
像随机搜索一样,网格搜索对于通常使用领域专业知识来影响特定优化算法选择的问题尤其有效。网格可以帮助快速识别可能需要更多注意的搜索空间区域。样本的网格通常是均匀的,尽管不一定是这种情况。例如,可以使用等距的log-10标度,以允许跨多个数量级执行采样。不利的一面是,网格的粗糙程度可能会遍及搜索空间中可找到好的解决方案的整个区域,而随着该问题的输入数量(搜索空间的维数)增加,该问题将变得更加严重。通过选择点的均匀间隔,然后依次枚举每个变量,并通过选择的间隔递增每个变量,可以生成样本网格。下面的示例给出了一个简单的二维最小化目标函数的示例,然后针对两个输入变量生成一个间距为0.1的网格样本。然后报告性能最佳的输入。
# example of grid search for function optimizationfrom numpy import arangefrom numpy.random import rand# objective functiondef objective(x, y):return x**2.0 + y**2.0# define range for inputr_min, r_max = -5.0, 5.0# generate a grid sample from the domainsample = list()step = 0.1for 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 samplesample_eval = [objective(x,y) for x,y in sample]# locate the best solutionbest_ix = 0for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i# summarize best solutionprint(‘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 plotfrom numpy import arangefrom numpy import meshgridfrom numpy.random import randfrom matplotlib import pyplot# objective functiondef objective(x, y):return x**2.0 + y**2.0# define range for inputr_min, r_max = -5.0, 5.0# generate a grid sample from the domainsample = list()step = 0.5for 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 samplesample_eval = [objective(x,y) for x,y in sample]# locate the best solutionbest_ix = 0for i in range(len(sample)):if sample_eval[i] < sample_eval[best_ix]:best_ix = i# summarize best solutionprint(‘Best: f(%.5f,%.5f) = %.5f’ % (sample[best_ix][0], sample[best_ix][1], sample_eval[best_ix]))# sample input range uniformly at 0.1 incrementsxaxis = arange(r_min, r_max, 0.1)yaxis = arange(r_min, r_max, 0.1)# create a mesh from the axisx, y = meshgrid(xaxis, yaxis)# compute targetsresults = objective(x, y)# create a filled contour plotpyplot.contourf(x, y, results, levels=50, cmap=’jet’)# plot the sample as black circlespyplot.plot([x for x,_ in sample], [y for _,y in sample], ‘.’, color=’black’)# draw the best result as a white starpyplot.plot(sample[best_ix][0], sample[best_ix][1], ‘*’, color=’white’)# show the plotpyplot.show()
再次运行该示例将生成网格样本并报告最佳结果。
Best: f(0.00000,0.00000) = 0.00000
然后创建一个等高线图,显示目标函数的形状,网格样本为黑点,白色星形代表样本的最佳结果。
请注意,域边缘的一些黑点似乎不在绘图上; 这只是我们如何选择绘制点的人工产物(例如不在样品上居中)。