【翻译自 : One-Dimensional (1D) Test Functions for Function Optimization】
【说明:Jason Brownlee PhD大神的文章个人很喜欢,所以闲暇时间里会做一点翻译和学习实践的工作,这里是相应工作的实践记录,希望能帮到有需要的人!】
函数优化是一个研究领域,它寻求函数的输入,导致函数的最大或最小输出。
优化算法有很多,在简单易懂的测试函数上研究和开发优化算法的直觉是很重要的。
一维函数采用单个输入值并输出对输入的单个评估。 当研究函数优化时,它们可能是最简单的测试函数类型。
一维函数的好处是它们可以被可视化为二维图,x 轴上是函数的输入,y 轴上是函数的输出。 函数的已知最优值和函数的任何采样也可以绘制在同一图上。
在本教程中,您将发现在学习函数优化时可以使用的标准一维函数。
教程概述
我们可以使用许多不同类型的简单一维测试函数。尽管如此,在函数优化领域中还是有一些常用的标准测试函数。在测试不同的算法时,我们可能希望选择测试函数的特定属性。我们将在本教程中探索少量简单的一维测试函数,并按它们的属性将它们分为五个不同的组;他们是:
凸单峰函数
非凸单峰函数
多模态函数
不连续函数(非平滑)
嘈杂的函数
每个函数都将使用 Python 代码呈现,其中包含目标目标函数的函数实现和函数的样本,该函数的样本显示为线图,并清楚地标记了函数的最优值。
所有的函数都表现为一个最小化问题,例如找到导致函数最小(最小值)输出的输入。通过向所有输出添加负号,任何最大化函数都可以成为最小化函数。类似地,任何最小化函数都可以以相同的方式最大化。
这些函数不是我发明的;它们取自文献。请参阅进一步阅读部分以获取参考资料。
然后,您可以选择并复制粘贴一个或多个函数的代码以在您自己的项目中使用,以研究或比较优化算法的行为。
凸单峰函数
凸函数是一种函数,其中可以在域中的任意两点之间绘制一条线,并且该线保留在域中。对于显示为二维图的一维函数,这意味着该函数具有碗状形状,并且两者之间的线保持在碗上方。单峰意味着函数有一个最优解。 凸函数可能是也可能不是单峰的; 类似地,单峰函数可能是也可能不是凸的。以下函数的范围限制为-5.0和5.0,最佳输入值为0.0。
# convex unimodal optimization function
from numpy import arange
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
# 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)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。
这个函数可以通过添加或减去一个常数值在数轴上向前或向后移动,例如 5 + x^2。
如果希望将最佳输入从 0.0 值移开,这会很有用。
非凸单峰函数
如果无法在域中的两点之间绘制一条线并且该线保留在域中,则函数为非凸函数。这意味着可以在域中找到两个点,它们之间的线与函数的线图相交。通常,如果一维函数的图有多个山丘或山谷,那么我们立即知道该函数是非凸函数。 然而,非凸函数可能是也可能不是单峰的。我们对优化感兴趣的大多数实际函数都是非凸函数。以下函数的范围限制为-10.0和10.0,最佳输入值为0.67956。
# non-convex unimodal optimization function
from numpy import arange
from numpy import sin
from numpy import exp
from matplotlib import pyplot# objective function
def objective(x):return -(x + sin(x)) * exp(-x**2.0)# define range for input
r_min, r_max = -10.0, 10.0
# 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)
# define optimal input value
x_optima = 0.67956
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。
多模态函数
多模态函数是指具有多个“模态”或最优值(例如谷值)的函数。
多峰函数是非凸的。可能存在一个全局最优解和一个或多个局部最优解或欺骗最优解。 或者,可能存在多个全局最优值,即导致函数的相同最小输出的多个不同输入。让我们看几个多模态函数的例子。
多模式函数 1
范围限制在 -2.7 和 7.5 之间,最佳输入值为 5.145735。
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot# objective function
def objective(x):return sin(x) + sin((10.0 / 3.0) * x)# define range for input
r_min, r_max = -2.7, 7.5
# 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)
# define optimal input value
x_optima = 5.145735
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。
多模式函数 2
范围限定为 0.0 和 1.2,最佳输入值为 0.96609。
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot# objective function
def objective(x):return -(1.4 - 3.0 * x) * sin(18.0 * x)# define range for input
r_min, r_max = 0.0, 1.2
# sample input range uniformly at 0.01 increments
inputs = arange(r_min, r_max, 0.01)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.96609
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。
多模式函数 3
范围限定在 0.0 和 10.0 之间,最佳输入值为 7.9787。
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot# objective function
def objective(x):return -x * sin(x)# define range for input
r_min, r_max = 0.0, 10.0
# 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)
# define optimal input value
x_optima = 7.9787
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
不连续函数(非平滑)
函数可能具有不连续性,这意味着函数输入的平滑变化可能会导致输出的非平滑变化。 我们可能将具有此属性的函数称为非平滑函数或不连续函数。有许多不同类型的不连续性,但一个常见的例子是函数输出值的跳跃或方向急剧变化,这在函数图中很容易看出。
不连续函数,范围限定在 -2.0 和 2.0 之间,最佳输入值为 1.0。
# non-smooth optimization function
from numpy import arange
from matplotlib import pyplot# objective function
def objective(x):if x > 1.0:return x**2.0elif x == 1.0:return 0.0return 2.0 - x# define range for input
r_min, r_max = -2.0, 2.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = [objective(x) for x in inputs]
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 1.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。
嘈杂的函数
函数可能具有噪声,这意味着每个评估可能具有随机成分,每次都会稍微改变函数的输出。通过向输入值添加小的高斯随机数,可以使任何非噪声函数产生噪声。以下函数的范围限制为-5.0和5.0,最佳输入值为0.0。
# noisy optimization function
from numpy import arange
from numpy.random import randn
from matplotlib import pyplot# objective function
def objective(x):return (x + randn(len(x))*0.3)**2.0# define range for input
r_min, r_max = -5.0, 5.0
# 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)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
运行示例将创建函数的折线图,并用红线标记最优值。