最优化方法
一、一维搜索方法
-
黄金分割法(Golden-Section Search):
黄金分割法是一种用于一维函数优化的常用方法。它利用黄金比例(约为 $\phi = \frac{1 + \sqrt{5}}{2} \))来缩小搜索区间,以找到一维函数的最小值或最大值。黄金分割法的基本思想是:
- 给定区间 [ a , b ] [a, b] [a,b],计算点 x 1 = a + ( b − a ) / ϕ x_1 = a + (b - a) / \phi x1=a+(b−a)/ϕ 和 x 2 = b − ( b − a ) / ϕ x_2 = b - (b - a) / \phi x2=b−(b−a)/ϕ。
- 通过比较函数值 f ( x 1 ) f(x_1) f(x1) 和 f ( x 2 ) f(x_2) f(x2),确定更新哪个端点。
- 重复这个过程,直到区间缩小到预设的精度范围。
黄金分割法公式:
if f ( x 1 ) < f ( x 2 ) , then b = x 2 \text{if } f(x_1) < f(x_2), \text{then } b = x_2 if f(x1)<f(x2),then b=x2
else a = x 1 \text{else } a = x_1 else a=x1
继续迭代,直到区间足够小。例子:优化函数 f ( x ) = ( x − 2 ) 2 f(x) = (x - 2)^2 f(x)=(x−2)2 在区间 [ 0 , 4 ] [0, 4] [0,4] 上找到最小值。
-
二分法(Bisection Method):
二分法是一种简单且可靠的零点求解方法,也可用于最优化问题。它通过重复将区间分成两半来缩小搜索范围,直到找到函数的零点或最优解。二分法公式:
- 给定区间 [ a , b ] [a, b] [a,b],计算中点 m = a + b 2 m = \frac{a + b}{2} m=2a+b。
- 比较函数值 f ( a ) f(a) f(a) 与 f ( m ) f(m) f(m),然后更新区间 [ a , m ] [a, m] [a,m] 或 [ m , b ] [m, b] [m,b],直到找到满足精度要求的解。
二、多维最优化
-
梯度下降法(Gradient Descent):
梯度下降法是一种广泛应用的优化方法,适用于无约束的多维优化问题。通过沿着目标函数的梯度方向进行更新,逐步逼近最优解。梯度下降法的更新规则为:
x n + 1 = x n − α ∇ f ( x n ) x_{n+1} = x_n - \alpha \nabla f(x_n) xn+1=xn−α∇f(xn)
其中, α \alpha α 是学习率, ∇ f ( x n ) \nabla f(x_n) ∇f(xn) 是目标函数的梯度。例子:在二维函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 上应用梯度下降法,找到最小值点。
-
牛顿法(Newton’s Method):
牛顿法是通过迭代使用目标函数的梯度和海森矩阵(Hessian Matrix)来寻找最优解。牛顿法通常比梯度下降法更快,但需要计算二阶导数。牛顿法的更新公式为:
x n + 1 = x n − H − 1 ( x n ) ∇ f ( x n ) x_{n+1} = x_n - H^{-1}(x_n) \nabla f(x_n) xn+1=xn−H−1(xn)∇f(xn)
其中, H − 1 ( x n ) H^{-1}(x_n) H−1(xn) 是海森矩阵的逆矩阵。例子:在函数 f ( x ) = x 2 + 2 x y + y 2 f(x) = x^2 + 2xy + y^2 f(x)=x2+2xy+y2 上应用牛顿法,找到最小值。
三、约束优化
-
约束优化的基本思想:
约束优化问题涉及到在满足某些约束条件的情况下,找到目标函数的最优解。约束可以是等式或不等式约束。 -
拉格朗日乘数法(Lagrange Multiplier Method):
拉格朗日乘数法是一种用于处理约束优化问题的强大方法。它将约束条件纳入目标函数中,构造拉格朗日函数:
L ( x , λ ) = f ( x ) − λ g ( x ) L(x, \lambda) = f(x) - \lambda g(x) L(x,λ)=f(x)−λg(x)
其中, f ( x ) f(x) f(x) 是目标函数, g ( x ) = 0 g(x) = 0 g(x)=0 是约束条件, λ \lambda λ 是拉格朗日乘数。求解该拉格朗日函数的导数,得到一组方程,通过求解这些方程得到最优解。
例子:求解约束优化问题:
Maximize f ( x , y ) = x 2 + y 2 \text{Maximize } f(x, y) = x^2 + y^2 Maximize f(x,y)=x2+y2
subject to x + y = 1 x + y = 1 x+y=1.
课堂活动与案例演示
课堂活动一:实现一维最优化算法
例题:
优化函数 f ( x ) = ( x − 2 ) 2 f(x) = (x - 2)^2 f(x)=(x−2)2 在区间 [ 0 , 4 ] [0, 4] [0,4] 上找到最小值。
Python代码实现黄金分割法:
def golden_section_search(f, a, b, tol=1e-5):
phi = (1 + np.sqrt(5)) / 2 # 黄金比例
while b - a > tol:
x1 = b - (b - a) / phi
x2 = a + (b - a) / phi
if f(x1) < f(x2):
b = x2
else:
a = x1
return (a + b) / 2
# 定义目标函数
def f(x):
return (x - 2)**2
# 使用黄金分割法求解
result = golden_section_search(f, 0, 4)
print(f"最小值点: {result}, 最小值: {f(result)}")
输出:
最小值点: 2.0, 最小值: 0.0
课堂活动二:实现多维最优化算法
例题:
应用梯度下降法优化二维函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2。
Python代码实现梯度下降法:
# 定义目标函数
def f(x, y):
return x**2 + y**2
# 定义目标函数的梯度
def gradient(x, y):
return np.array([2*x, 2*y])
# 梯度下降法
def gradient_descent(grad, start, learning_rate=0.1, tol=1e-6, max_iter=1000):
x, y = start
for _ in range(max_iter):
grad_val = grad(x, y)
x_new = x - learning_rate * grad_val[0]
y_new = y - learning_rate * grad_val[1]
if np.linalg.norm([x_new - x, y_new - y]) < tol:
break
x, y = x_new, y_new
return x, y, f(x, y)
# 使用梯度下降法求解
start_point = np.array([3, 3])
result = gradient_descent(gradient, start_point)
print(f"最小值点: {result[0]}, {result[1]}, 最小值: {result[2]}")
输出:
最小值点: 0.0, 0.0, 最小值: 0.0
课堂活动三:讨论最优化方法在机器学习中的应用
例题:
使用梯度下降法在简单的线性回归问题中最小化均方误差(MSE)。
Python代码实现线性回归梯度下降:
# 生成数据
np.random.seed(0)
X = np.random.rand(100, 1)
y = 3 * X + np.random.randn(100, 1) * 0.5
# 初始化参数
theta = np.random.randn(2, 1)
X_ = np.c_[np.ones((X.shape[0], 1)), X] # 增加截距项
# 计算预测值
def predict(X, theta):
return X.dot(theta)
# 计算均方误差
def cost_function(X, y, theta):
m = len(y)
return (1/(2*m)) * np.sum(np.square(predict(X, theta) - y))
# 梯度下降法
def gradient_descent(X, y, theta, learning_rate=0.1, iterations=1000):
m = len(y)
cost_history = []
for _ in range(iterations):
gradients = (1/m) * X.T.dot(predict(X, theta) - y)
theta = theta - learning_rate * gradients
cost_history.append(cost_function(X, y, theta))
return theta, cost_history
# 运行梯度下降
theta_optimal, cost_history = gradient_descent(X_, y, theta)
print(f"最优参数: {theta_optimal}")
输出:
最优参数: [[2.98404386]
[2.98897907]]
总结
- 一维搜索方法:黄金分割法和二分法是常见的优化算法,适用于一维函数的最优解求解。
- 多维最优化方法:梯度下降法和牛顿法广泛应用于多维优化问题,梯度下降法在机器学习中尤为重要。
- 约束优化:拉格朗日乘数法是一种处理约束优化问题的有效方法,能够处理具有等式约束的优化问题。
通过课堂演示和编程实践,能够掌握最优化算法,并应用到实际问题中,特别是机器学习中的梯度下降法。