带矩阵线性等式约束的L₁范数最小化问题求解及代码实现
在约束Mx=y下最小化L₁范数的实现方案
我最近碰到这么个问题:需要在线性约束条件 Mx = y 下,最小化向量x的L₁范数。这里的参数定义是:
- x是b维向量
- y是a维向量
- M是a×b维度的矩阵
查了一圈资料后,我决定用scipy.optimize.minimize来实现这个优化问题,下面是整理好的代码和关键细节:
核心实现代码
import numpy as np from scipy.optimize import minimize def objective(x): # 定义L₁范数作为目标函数 return np.linalg.norm(x, ord=1) # 假设这里已经提前定义好a, b, M, y的值 constraints = [] # 存储所有约束函数的列表 for i in range(a): # 注意:必须把i和y作为默认参数传入,避免闭包延迟绑定的坑 def con(x, y=y, i=i): return np.matmul(M[i], x) - y[i] constraints.append(con) # 初始化x的初始猜测值(比如全零向量) x0 = np.zeros(b) # 执行优化:使用SLSQP求解器,因为它支持等式约束 result = minimize(objective, x0, constraints=[{'type': 'eq', 'fun': con} for con in constraints]) # 输出结果 print("优化后的x向量:", result.x) print("最小化的L₁范数值:", result.fun)
关键细节说明
- 目标函数:直接用
np.linalg.norm(x, ord=1)计算L₁范数,简洁高效。 - 约束定义的坑:在循环里定义约束函数时,一定要把
i和y作为默认参数传入。如果不这么做,Python的闭包会延迟绑定变量,导致所有约束函数最后都引用循环的最后一个i值,完全不符合预期。 - 求解器选择:
minimize函数默认的求解器可能不支持等式约束,这里用SLSQP求解器是因为它能很好处理线性/非线性的等式、不等式约束。
内容的提问来源于stack exchange,提问作者kevinkayaks
相关产品推荐
相关产品推荐

