人工智能之数学基础 优化理论
第三章 约束优化----公式关注公众号
前言
约束优化是优化理论的核心分支,广泛应用于机器学习(如正则化)、经济学(资源分配)、工程设计(结构优化)等领域。本文系统讲解等式约束优化的拉格朗日乘数法、不等式约束的 KKT 条件、L1/L2 正则化与约束形式的等价性,并提供完整的 Python(SciPy / CVXPY / NumPy / Matplotlib)代码实现与可视化。
一、约束优化问题的一般形式
- 可行域:满足所有约束的点集
- 目标:在可行域内找到使 最小的点
✅ 若无约束(),退化为无约束优化。
二、1. 拉格朗日乘数法(Lagrange Multipliers)
适用场景
仅含等式约束的优化问题:
核心思想
在最优解处,目标函数的梯度与约束函数的梯度平行:
拉格朗日函数
引入乘子 ,构造:
必要条件(一阶)
若 是局部极值点,且 ,则存在 使得:
🔑 几何解释:等高线 与约束曲线 相切
📌 示例:最小化 满足
- 目标:
- 约束:
拉格朗日函数:
求偏导并令为零:
最优值:( f(0.5, 0.5) = 0.5 )
三、2. KKT 条件(Karush–Kuhn–Tucker)
适用场景
含等式 + 不等式约束的一般非线性规划问题。
拉格朗日函数(广义)
KKT 条件(必要条件,若满足约束规范)
- 稳定条件:
- 原始可行性:
- 对偶可行性:
- 互补松弛性:
💡 互补松弛性:若约束不起作用(),则 ;若 ,则约束紧()
特殊情况:凸优化
若 凸、 凸、线性,则 KKT 条件是全局最优的充要条件。
四、3. 正则化与约束优化的等价性
在机器学习中,正则化常以无约束形式出现,但可等价转换为约束优化。
L2 正则化(岭回归)
-
无约束形式:
-
等价约束形式:
其中 一一对应(通过 KKT 条件)
L1 正则化(Lasso)
- 无约束形式:
- 等价约束形式:
🔑 关键区别:
- L2 约束: → 圆形/球形可行域 → 解稀疏性弱
- L1 约束: → 多面体可行域 → 易在顶点处取解 → 稀疏性
五、Python 代码实现
1. 导入库
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize, NonlinearConstraint
import cvxpy as cp
np.random.seed(42)
2. 拉格朗日乘数法:解析求解 + 数值验证
解析解(上例)
# 手动解:x = y = 0.5
x_star, y_star = 0.5, 0.5
print(f"解析解: x={x_star}, y={y_star}, f={x_star**2 + y_star**2}")
数值求解(SciPy)
def objective(xy):
return xy[0]**2 + xy[1]**2
def constraint_eq(xy):
return xy[0] + xy[1] - 1 # =0
# 定义等式约束
eq_cons = {'type': 'eq', 'fun': constraint_eq}
res = minimize(objective, x0=[0, 0], constraints=[eq_cons])
print(f"数值解: x={res.x[0]:.6f}, y={res.x[1]:.6f}, f={res.fun:.6f}")
3. KKT 条件:不等式约束优化
问题:最小化 满足
def constraint_ineq(xy):
return xy[0] + xy[1] - 1 # 要求 >=0 → SciPy 中定义为 >=0
# SciPy 要求不等式约束为: cons(x) >= 0
ineq_cons = NonlinearConstraint(constraint_ineq, lb=0, ub=np.inf)
res_kkt = minimize(objective, x0=[0, 0], method='SLSQP', constraints=[ineq_cons])
print(f"KKT 数值解: x={res_kkt.x[0]:.6f}, y={res_kkt.x[1]:.6f}, f={res_kkt.fun:.6f}")
print(f"约束值: x+y = {res_kkt.x.sum():.6f} (应 ≥1)")
✅ 输出应与等式约束相同(因为最优解在边界 ( x+y=1 ) 上)
4. 可视化:约束优化的几何意义
# 绘制目标函数等高线 + 约束
x = np.linspace(-0.5, 1.5, 200)
y = np.linspace(-0.5, 1.5, 200)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2
plt.figure(figsize=(8, 6))
# 等高线
contour = plt.contour(X, Y, Z, levels=20, cmap='viridis')
plt.clabel(contour, inline=True, fontsize=8)
# 等式约束:x + y = 1
plt.plot(x, 1 - x, 'r-', linewidth=2, label=r'$x + y = 1$')
# 不等式约束区域:x + y >= 1
plt.fill_between(x, 1 - x, 1.5, color='red', alpha=0.1, label=r'$x + y \geq 1$')
# 最优解
plt.plot(0.5, 0.5, 'go', markersize=10, label='最优解 (0.5, 0.5)')
plt.xlim(-0.5, 1.5); plt.ylim(-0.5, 1.5)
plt.xlabel('x'); plt.ylabel('y')
plt.title('约束优化:等高线与可行域')
plt.legend(); plt.grid(True)
plt.show()
5. L1/L2 正则化:约束形式 vs 无约束形式
生成数据
# 线性回归数据
n_samples, n_features = 50, 10
X = np.random.randn(n_samples, n_features)
true_w = np.array([1, 0.5, -0.3] + [0]*(n_features-3)) # 稀疏真实权重
y = X @ true_w + 0.1 * np.random.randn(n_samples)
(a) L2 正则化(Ridge)— 无约束
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0, fit_intercept=False)
ridge.fit(X, y)
w_ridge = ridge.coef_
print("L2 (Ridge) 权重:", np.round(w_ridge, 3))
(b) L1 正则化(Lasso)— 无约束
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.1, fit_intercept=False, max_iter=2000)
lasso.fit(X, y)
w_lasso = lasso.coef_
print("L1 (Lasso) 权重:", np.round(w_lasso, 3))
print("Lasso 零系数数量:", np.sum(np.abs(w_lasso) < 1e-4))
(c) 约束形式:使用 CVXPY
L2 约束(二次锥规划)
w = cp.Variable(n_features)
objective = cp.Minimize(cp.sum_squares(X @ w - y))
constraints = [cp.norm(w, 2) <= 1.0] # ||w||_2 <= t
prob_l2 = cp.Problem(objective, constraints)
prob_l2.solve()
print("L2 约束解范数:", np.linalg.norm(w.value, 2))
L1 约束(线性规划)
w = cp.Variable(n_features)
objective = cp.Minimize(cp.sum_squares(X @ w - y))
constraints = [cp.norm(w, 1) <= 1.0] # ||w||_1 <= t
prob_l1 = cp.Problem(objective, constraints)
prob_l1.solve()
print("L1 约束解范数:", np.linalg.norm(w.value, 1))
print("L1 约束零系数数量:", np.sum(np.abs(w.value) < 1e-4))
✅ 验证:L1 约束解具有稀疏性,L2 解更平滑。
6. 对偶问题与拉格朗日对偶性(简要)
对于凸问题,原问题(Primal)与对偶问题(Dual)满足:
- 强对偶性:等号成立(凸问题 + Slater 条件满足时)
- 对偶变量 即拉格朗日乘子,表示约束的“影子价格”
📌 在 SVM 中,对偶问题将优化从样本维度转到支持向量维度。
六、常见约束类型与求解器
| 约束类型 | 数学形式 | 求解方法 | Python 工具 |
|---|---|---|---|
| 线性等式 | 内点法、单纯形 | scipy.optimize.linprog | |
| 线性不等式 | 同上 | 同上 | |
| 二次约束 | 二次锥规划(SOCP) | CVXPY + ECOS | |
| L1 约束 | 线性规划 | CVXPY | |
| 非线性约束 | SLSQP、IPOPT | scipy.optimize.minimize |
七、总结
| 方法 | 适用问题 | 关键条件 | 应用 |
|---|---|---|---|
| 拉格朗日乘数法 | 仅等式约束 | 几何优化、物理 | |
| KKT 条件 | 等式+不等式 | 约束规范 | 一般非线性规划 |
| L2 正则化 | 无约束 | — | 岭回归、防止过拟合 |
| L1 正则化 | 无约束 | — | Lasso、特征选择 |
| 约束形式 | 显式限制参数 | — | 可解释性、安全关键系统 |
💡 核心洞见:
- 拉格朗日乘子衡量约束的“敏感度”;
- 正则化 = 软约束,约束优化 = 硬约束;
- L1 约束的几何形状导致稀疏性;
- 凸问题 + KKT = 全局最优保证。
掌握约束优化,你将能处理从带预算限制的投资组合到带安全约束的机器人控制等复杂现实问题。动手运行代码,观察不同约束对解的影响,建立直观理解!
后续
python过渡项目部分代码已经上传至gitee,后续会逐步更新。
资料关注
公众号:咚咚王
《Python编程:从入门到实践》 《利用Python进行数据分析》 《算法导论中文第三版》 《概率论与数理统计(第四版) (盛骤) 》 《程序员的数学》 《线性代数应该这样学第3版》 《微积分和数学分析引论》 《(西瓜书)周志华-机器学习》 《TensorFlow机器学习实战指南》 《Sklearn与TensorFlow机器学习实用指南》 《模式识别(第四版)》 《深度学习 deep learning》伊恩·古德费洛著 花书 《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》 《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》 《自然语言处理综论 第2版》 《Natural-Language-Processing-with-PyTorch》 《计算机视觉-算法与应用(中文版)》 《Learning OpenCV 4》 《AIGC:智能创作时代》杜雨+&+张孜铭 《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》 《从零构建大语言模型(中文版)》 《实战AI大模型》 《AI 3.0》