摘要:MATLAB中的CVX工具包十分强大,信号处理中的各种波束形成问题、压缩感知问题都可以转化为凸优化的标准格式,然后通过工具箱直接求解。Python中的cvxpy也是由CVX团队开发的,但用起来好像没CVX那么强大(主要是复数的问题),这里简单介绍了cvxpy工具包的使用,并将其用于求解稀疏约束的优化问题。不会对原理进行介绍,上来就是调包。
系列目录
- Python信号处理:快速傅里叶变换(FFT),短时傅里叶变换(STFT),窗函数,以及滤波
- Python信号处理:自相关函数(对标MATLAB中的autocorr)
- Python信号处理:波束形成及目标方位估计,CBF、MVDR
- Python信号处理:cvxpy工具包求解稀疏约束优化问题
目录
- cvxpy基本调用方法
- 稀疏约束问题求解
1. cvxpy基本调用方法
cvxpy和CVX一样,有很多特殊的方法,如cvxpy.norm
, cvxpy.sum_squares
,分别表示求范数和平方和。具体的函数名称可以很容易的查到。
cvxpy使用中的基本步骤如下:
首先定义优化变量,可以是标量、向量、矩阵。
# 标量
x = cvx.Variable()
# 向量
x = cvx.Variable(5)
# 矩阵大小为(5, 1).
x = cvx.Variable((5, 1))
再定义目标函数,写成最小化的形式。
func = cvx.Minimize(cvx.sum_squares(A*x - b))
然后设置约束条件,这里直接用L1范数约束。
cons = [cvx.norm(x, 1) <= 0.001]
最后定义完整的优化问题,并通过solve求解。
prob = cvx.Problem(func, cons)
prob.solve()
2. 稀疏约束问题求解
对应的优化问题为
min
x
∣
∣
A
x
−
b
∣
∣
2
2
,
s
.
t
.
∣
∣
x
∣
∣
1
<
=
η
,
\min_{x}\quad ||Ax-b||^2_2, \quad \quad s.t.\quad ||x||_1<=\eta,
xmin∣∣Ax−b∣∣22,s.t.∣∣x∣∣1<=η,
其中,A为字典矩阵,b为观测向量。将该优化问题用numpy+cvxpy描述如下:
import cvxpy as cvx
import matplotlib.pyplot as plt
import numpy
# 构造字典A和观测数据b
m = 10
n = 500
numpy.random.seed(1)
A = numpy.random.randn(m, n)
b = numpy.random.randn(m)
# 问题描述
x = cvx.Variable(n)
objective = cvx.Minimize(cvx.sum_squares(A*x - b))
constraints = [cvx.norm(x, 1) <= 0.001]
prob = cvx.Problem(objective, constraints)
print("Optimal value", prob.solve())
求解得到最优值为8.4,同时500维的向量x确实是稀疏的,x的值如下图所示。