摘要: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. 稀疏約束問題求解
對應的優化問題爲
其中,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的值如下圖所示。