压缩感知(Compressed Sensing, CS)是一种信号处理技术,它允许从远低于奈奎斯特采样定律所要求的采样率下重构稀疏(或可压缩)信号。这是基于信号稀疏性的先验知识。
基本流程
其基本流程如下:
-
采样:与传统的均匀采样不同,压缩感知使用非均匀的随机采样策略,收集信号的线性投影(而非信号本身的样本)。这些投影足以捕获信号的本质信息。
-
编码:此步骤实际上与采样并行执行。信号通过与测量矩阵(也称为感知矩阵)进行线性混合来获得测量值。测量矩阵具有特别设计的属性,以确保能从较少的测量中恢复信号。
-
压缩:在压缩感知中,采样和编码步骤实质上是信号压缩的一部分。由于采样点远少于信号长度,这种方法将高维数据映射到低维空间。
-
重建:在解码器端,通过优化技术从压缩的测量值中恢复出原始信号。这些算法利用信号的稀疏特性来找到最少非零元素的解,比如使用L1正则化。
-
解码:重建算法输出稀疏信号的估计,这个过程实际上就是信号的解码过程,得到的结果可以用于后续的应用,例如图像重建。
简单解释
压缩感知是一种让我们可以从比传统方法更少的样本中重建信号的技术。这依赖于信号的稀疏性质,意味着信号可以用少量非零数字准确描述。通过使用特制的随机测量矩阵采样信号,并利用数学优化技术从这些不完整的数据中恢复出完整信号,从而减少了在采集、存储和传输过程中所需的数据量。
示例及Python实现
例子
考虑一个十维信号 h = [ 1 , 2 , 0 , 0 , 3 , 0 , 0 , 4 , 5 , 0 ] h = [1,2,0,0,3,0,0,4,5,0] h=[1,2,0,0,3,0,0,4,5,0]。为了将这个信号压缩成5维的形式,我们进行随机采样并计算信号的几个线性投影(这里是用一个测量矩阵 A A A的五行来做的)。然后,利用L1正则化重建算法从这些投影中恢复原始信号。这个过程涉及最小化测量向量和信号的线性组合之间的误差的同时保持信号的稀疏性。最后重建的信号可用于其他应用。
让我们按步骤细化这个例子,并用Python代码模拟整个压缩感知过程。
步骤如下:
-
采样:对信号 h h h进行随机采样。在这个例子中,我们不会采样信号 h h h的所有维度,而是选择一些维度进行采样。采样过程通过一个二进制的测量矩阵 A A A表示,其中每行代表一个测量操作,1表示在该行对应的列上采样信号。
-
编码:实施编码过程,通过与测量矩阵相乘,获得一个压缩版的信号。这个向量 y y y是原始信号的压缩表征。
-
重建:使用一个优化算法对信号进行重建。在压缩感知中,常用的一种方法是L1最小化,也称为Lasso回归。目标是找到一个稀疏解 h ′ h' h′,它使得重建误差 ∣ ∣ y − A h ′ ∣ ∣ 2 2 ||y-Ah'||_2^2 ∣∣y−Ah′∣∣22和信号的L1范数 ∣ ∣ h ′ ∣ ∣ 1 ||h'||_1 ∣∣h′∣∣1之和最小化。
-
解码:最终解码的步骤实际上就是信号重建的过程本身。重建的信号 h ′ h' h′可以用于后续的处理或分析。
Python实现
现在我们用Python代码模拟这个过程:
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 19 17:43:07 2024@author: 李立宗公众号:计算机视觉之光知识星球:计算机视觉之光"""import numpy as np
from cvxpy import *# 定义原始信号
h = np.array([1, 2, 0, 0, 3, 0, 0, 4, 5, 0])# 定义测量矩阵A
A = np.random.randn(5, 10)# 获取测量值(编码过程)
y = A.dot(h)# 重建信号(解码过程)
h_prime = Variable(10)
objective = Minimize(0.5*sum_squares(A@h_prime - y) + 0.1*norm(h_prime, 1))
problem = Problem(objective)
problem.solve()h_reconstructed = h_prime.value# 将小于0.1的数值转换为0
h_reconstructed[np.abs(h_reconstructed) < 0.1] = 0# 将重建后的数值四舍五入
h_reconstructed = np.round(h_reconstructed).astype(int)print("Original signal:", h)
print("Reconstructed signal:", h_reconstructed)
可能的输出结果
部分输出

代码解释
在这段代码中,我们使用了 cvxpy 库来进行优化问题的求解。这个库提供了求解凸优化问题的接口,刚好适用于这个L1最小化问题。我们使用正态分布生成实数矩阵A,以模拟测量矩阵。
请注意,为了运行这段代码,需要安装 cvxpy 及其依赖包,可以使用 pip install cvxpy 来安装。