线搜索
线搜索是一个一元优化问题,为了引导搜索,可以使用线搜索目标的导数,即x+ad处沿d的方向导数。线搜索的算法为如下:
线搜索的一般步骤:
- 选择一个初始点
和一个搜索方向
。
- 通过尝试不同的步长
来最小化目标函数
。
使用SciPy中的minimize
函数,该函数可以用于多维优化问题。
考虑以下目标函数:
这是一个二维的凸函数,最小值在处。
以下是相应的 Python 代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import matplotlib
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
# 定义目标函数
def objective_function(x):
return (x[0] - 3)**2 + (x[1] - 2)**2
# 初始点
initial_point = np.array([0.0, 0.0])
# 执行线搜索
result = minimize(objective_function, x0=initial_point, method='BFGS')
# 输出结果
print("最小值所在的位置:", result.x)
print("最小值:", result.fun)
# 绘制迭代图像
x1_vals = np.linspace(-1, 5, 100)
x2_vals = np.linspace(-1, 5, 100)
X1, X2 = np.meshgrid(x1_vals, x2_vals)
Z = (X1 - 3)**2 + (X2 - 2)**2
plt.contour(X1, X2, Z, levels=20, cmap='viridis')
plt.scatter(result.x[0], result.x[1], color='red', marker='x', label='最小值')
plt.title('目标函数和迭代过程')
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend()
plt.show()
运行结果:
最小值所在的位置: [2.99999999 1.99999999]
最小值: 1.84598775337616e-16
迭代过程中,我们通过绘制等高线图可视化了目标函数,并在图中标记出了每次迭代的位置。最终,我们用红色的 "x" 标记了找到的最小值所在的位置。