近似消息传递算法(AMP)单测量模型(SMV)

news2024/11/17 21:50:31

1、算法解决问题

很多人致力于解决SLM模型的求逆问题,即知道观测值和测量矩阵(字典之类的),要求未知变量的值。SLM又叫做标准线性模型,后续又在此基础上进行升级变为广义线性模型。即SLM是y=Ax+e,这里是线性关系,而到广义里可能就不单单只是Ax这个线性关系,可能是一个非线性函数y=F(x),此时就适合进一步的广义近似消息传递GAMP。并且在压缩感知CS出现后,又有很多人的兴趣转向与稀疏信号重构的问题。到底怎么才能解这个方程又快又准呢。大多数时候这二者不可兼得,我们要取其中之一。比如经典的贪婪算法或者叫追踪算法的衍生类,它们扮演着一步步找最优原子(最相关的原子)来扩展它的支撑集,直到迭代终止,这个过程涉及矩阵求逆,在测量矩阵维度高的情况下复杂度及其高。后续又有凸优化类的算法,由于本人涉猎不多,词穷。后面还有稀疏贝叶斯类算法(像什么伯努利高斯(Spike and slab)、稀疏贝叶斯学习(SBL))都是用来解决稀疏信号重构的问题。而稀疏信号重构就涉及通信领域的一个大规模机器通信或者叫IOT,而这个稀疏性又可以表示在OTFS系统下的信道物理特性。因此算法可以经过改进而应用到信道估计和活跃用户检测。或者是符号检测及活跃用户检测上。

2、算法由来

[1]Donoho, David L., Arian Maleki, and Andrea Montanari. "Message-passing algorithms for compressed sensing." Proceedings of the National Academy of Sciences 106.45 (2009): 18914-18919.

[2]Donoho, David L., Arian Maleki, and Andrea Montanari. "How to design message passing algorithms for compressed sensing." preprint (2011).

由Donoho等人在[1,2]中引入的近似消息传递(AMP)算法, AMP 是一个基于消息传递的框架,为解决压缩感知背景下的基追踪或基追踪去噪问题而开发。AMP 也可以被视为迭代阈值算法类的一个实例。然而,AMP 与此类其他算法的区别在于,它具有显着更好的稀疏性欠采样权衡。

3、算法

[3]Andersen, Michael Riis. "Sparse inference using approximate message passing." Technical University of Denmark, Department of Applied Mathematics and Computing (2014).

考虑线性方程组y=Ax ,其中  A \in \Re ^{^{m,n}}  、y \in \Re ^{^{m,1}}x\in \Re ^{^{n,1}}是真解。假设 A 的列已缩放至单位“2-范数”。给定问题的欠采样率 δ 将定义为 δ = m/n,k 表示真实解中非零元素的数量,稀疏度将定义为 ρ = k/m 。对于基追踪问题,AMP 的简单更新方程由下式给出

以上算法是无噪声版本的AMP,下式是我们常用的有噪声版本。通常噪声服从零均值固定方差的高斯或者复高斯分布,即高斯白噪声。

短短的三行公式,却有着很大魅力。其中 λ 是正则化参数。通过比较 BP 和 BPDN 的更新方程,可以看出,当 λ = 0 时,两种算法是相同的,因此我们只关注后者而不失一般性。

我读了一篇国外的硕士论文,eta函数是这麽推到的(来源于消息传递因子图,当然我也是这个方向的)当然这个图不清晰,我把论文[3]标题附在上方

当然eta的导数文中也有推到,需要的自己去查看即可

其实就是一个倒门函数,在特定区间为0,其他为1

4、算法代码(来源Github)

当然这个稀疏值个数也不是必须的,tau初始化为1也是可以正常运行的。

function xest = amp(y,sparsity,A,niter)

[M,N]=size(A);
tau = sqrt(2*log10(M/sparsity)); % needs to be tuned in case of unknown prior sparsity level

%% Approximate Message Passing for basis selection
% Initializing
xest = zeros(N,1);
z = y;
eta = @(x,beta) (x./abs(x)).*(abs(x)-beta).*(abs(x)-beta > 0); % denoising function
for iter=1:niter
   sigma = norm(z,2)/sqrt(M);
   xest = eta(xest + A'*z, tau*sigma);
   tmp = sum(abs(xest) > 0);
   z = y - A*xest + (tmp/M)*z;
end

%[abs(xest) abs(x)]
end

5、稀疏信号重构demo

做一个测试demo,测量数为稀疏信号维度的一半,稀疏度13/128。噪声估计也是很小的。当然如果想设计信噪比下的恢复效果。可以根据信噪比公式去设置。就是那个dB转换公式,将其中一个已知,来求解另一个。比如dB=20,此时你生成的观测和稀疏向量是暂时知道的,通过他俩计算信号功率,然后得到噪声功率。当然想了解的人可以去关注我一个师兄的公众号MessagePassing或者是搜一搜。

信噪比SNR的两种计算方法

clc;
clear all;
N = 128; % length of vector to be recovered
M = 64; % number of measurement
A = (1/sqrt(2))*(normrnd(0,1/sqrt(M),M,N) + 1i*normrnd(0,1/sqrt(M),M,N)); % Sensing matrix construction for theroetical bound
x = zeros(N,1); % Initializing sparse vector to be recovered
k = 13; % Sparsity level
uset = randperm(N,k); 
x(uset) = rand(k,1) + 1i*rand(k,1); % Sparse vector initialized
noise = sqrt(1/2)*(normrnd(0,1,M,1) + 1i*normrnd(0,1,M,1)); % zero mean, unit covariance complex noise vector
var = 1e-11;
noise = sqrt(var)*noise;
y = A*x + noise; % create measurement
niter = 30; % number of iteration
%% Approximate Message Passing for basis selection
xest = amp(y,k,phi,niter);
plot(abs(x),'r-o');

hold on;
plot(abs(xest),'b+-');
legend('xreal','xest');
title('recover  complex signal')
nmse=norm(xest-x).^2/(norm(x).^2);
disp(nmse)
%[abs(xest) abs(x)]

效果图及NMSE如下,当然想去与OMP做对比的也可以。OMP算法要知道稀疏度或者是一些带噪声根据阈值来判断的变体算法也不是很好,很容易找错。当然后续我也会更新一些其他的算法及代码

  8.3788e-11

6、根据论文复现的AMP0代码

function [x_est] = AMP_Lplace(y,A,maxiter)
%%根据论文写的AMP0算法,效果没有之前的GitHub上的好
[M,N]=size(A);
%% Approximate Message Passing for Laplace Prio
% Initializing
x_est = zeros(N,1);
z = y;
tau=1;
delta = M/N;
etafunc = @(x,beta) (x./abs(x)).*(abs(x)-beta).*(abs(x)-beta >0); % (abs(x)-beta >0) is logical num
etafuncdiff = @(x,beta) ((abs(x)-beta >=0));
for iter=1:maxiter
    x_est = etafunc(x_est + A'*z, tau);
    z = y - A*x_est + 1/delta*z.*mean(etafuncdiff(x_est + A'*z,tau));
    tau = tau/delta*mean(etafuncdiff(x_est + A'*z,tau));
end
clc;
clear all;
N = 128; % length of vector to be recovered
M = 64; % number of measurement
A = (1/sqrt(2))*(normrnd(0,1/sqrt(M),M,N) + 1i*normrnd(0,1/sqrt(M),M,N)); % Sensing matrix construction for theroetical bound
x = zeros(N,1); % Initializing sparse vector to be recovered
k = 13; % Sparsity level
uset = randperm(N,k); 
x(uset) = rand(k,1) + 1i*rand(k,1); % Sparse vector initialized
noise = sqrt(1/2)*(normrnd(0,1,M,1) + 1i*normrnd(0,1,M,1)); % zero mean, unit covariance complex noise vector
var = 1e-5;
noise = sqrt(var)*noise;
y = A*x + noise; % create measurement
niter = 30; % number of iteration
%% Approximate Message Passing for basis selection
x_est1 = amp(y,k,A,niter);
[x_est2] = AMP_Lplace(y,A,niter);
plot(abs(x),'r-o');

hold on;
plot(abs(x_est1),'b+-');
plot(abs(x_est1),'g--');
legend('xreal','xest','xestmine');
title('recover  complex signal')
nmse1=norm(x_est1-x).^2/(norm(x).^2);
nmse2=norm(x_est2-x).^2/(norm(x).^2);
disp(nmse1)
disp(nmse2)
%[abs(xest) abs(x)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1642773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

循环神经网络完整实现(Pytorch 13)

一 循环神经网络的从零开始实现 从头开始基于循环神经网络实现字符级语言模型。 %matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, vocab …

【ARM Cortex-M3指南】3:Cortex-M3基础

文章目录 三、Cortex-M3基础3.1 寄存器3.1.1 通用目的寄存器 R0~R73.1.2 通用目的寄存器 R8~R123.1.3 栈指针 R133.1.4 链接寄存器 R143.1.5 程序计数器 R15 3.2 特殊寄存器3.2.1 程序状态寄存器3.2.2 PRIMASK、FAULTMASK和BASEPRI寄存器3.2.3 控制寄存器 3.3 操作模式3.4 异常…

缓冲流,BufferReader,BufferWriter,案例

IO流的体系 字节缓冲流的作用 提高字节流读取数据的性能 *原理:字节缓冲输入流自带了8Kb的缓冲池,字节缓冲输出流也自带了8kb的缓冲池 构造器说明public BufferedInputStream(InputStream is)把低级的字节输入流包装成一个高级的缓冲字节输入流&#…

RabbitMQ之顺序消费

什么是顺序消费 例如:业务上产生者发送三条消息, 分别是对同一条数据的增加、修改、删除操作, 如果没有保证顺序消费,执行顺序可能变成删除、修改、增加,这就乱了。 如何保证顺序性 一般我们讨论如何保证消息的顺序性&…

【Linux】进程exec函数族以及守护进程

一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面,而shell是如何做到不在一个文件里面写代码使之成为子进…

4- 29

五六月安排 5.12江苏CPC 6.2、6.16、6.30三场百度之星省赛 6月蓝桥杯国赛 7.15 睿抗编程赛道省赛 5 6月两个科创需要申请完软著。 网络技术挑战赛过了资格赛,下面不知道怎么搞,如果参加需要花费很多的时间。 1.100个英语单词一篇阅读,讲了文…

Docker Compose 部署若依前后端分离版

准备一台服务器 本次使用虚拟机,虚拟机系统 Ubuntu20.04,内存 4G,4核。 确保虚拟机能连接互联网。 Ubuntu20.04 安装 Docker 添加 Docker 的官方 GPG key: sudo apt-get update sudo apt-get install ca-certificates curl su…

Hibernate的QBC与HQL查询

目录 1、Hibernate的QBC查询 2、Hibernate的HQL查询 3、NatvieSQL原生查询 1、Hibernate的QBC查询 Hibernate具有一个直观的、可扩展的条件查询API public class Test { /** * param args */ public static void main(String[] args) { Session sessio…

【八股】AQS,ReentrantLock实现原理

AQS 概念 AQS 的全称是 AbstractQueuedSynchronized (抽象队列同步器),在java.util.concurrent.locks包下面。 AQS是一个抽象类,主要用来构建锁和同步器,比如ReentrantLock, Semaphore, CountDownLatch,里…

安卓LayoutParams浅析

目录 前言一、使用 LayoutParams 设置宽高二、不设置 LayoutParams2.1 TextView 的 LayoutParams2.2 LinearLayout 的 LayoutParams 三、getLayoutParams 的使用四、setLayoutParams 的作用五、使用 setWidth/setHeight 设置宽高 前言 先来看一个简单的布局,先用 x…

Jackson-jr 对比 Jackson

关于Jackson-jr 对比 Jackson 的内容,有人在做了一张下面的图。 简单点来说就 Jackson-jr 是Jackson 的轻量级应用,因为我们在很多时候都用不到 Jackson 的很多复杂功能。 对很多应用来说,我们可能只需要使用简单的 JSON 读写即可。 如我们…

手撕spring框架(5)

手撕spring框架(5) 相关系列 手撕spring框架(1) 手撕spring框架(2) 手撕spring框架(3) 手撕spring框架(4) 这是本专题最后一节了,主要是讲述自定义一个注解,实…

QT中的容器

Qt中的容器 关于Qt中的容器类,下面我们来进行一个总结: Qt的容器类比标准模板库(STL)中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的,而且他们进行了速度和存储的优化,因此可以减少可…

HackTheBox_knote

前言 最近打算刷一些内核利用的 CTF 的题目~~~ 题目分析 内核版本:v5.8.3,但是没有开启 cg 隔离smap/smep/kpti/kaslr 全关,可以 ret2usr,所以应该是比较老的题目了(:这里很奇怪的是就算设置 kaslr 但是…

虚拟化技术 使用Vsphere Client管理ESXi服务器系统

使用Vsphere Client管理ESXi服务器系统 一、实验目的与要求 1.掌握使用vSphere Client管理ESXi主机 2.掌握将CentOS的安装介质ISO上传到ESXi存储 3.掌握在VMware ESXi中创建虚拟机 4.掌握在所创建的虚拟机中安装CentOS6.5操作系统 5.掌握给CentOS6.5安装VMware Tools 6.掌…

RabbitMQ(Docker 单机部署)

序言 本文给大家介绍如何使用 Docker 单机部署 RabbitMQ 并与 SpringBoot 整合使用。 一、部署流程 拉取镜像 docker pull rabbitmq:3-management镜像拉取成功之后使用下面命令启动 rabbitmq 容器 docker run \# 指定用户名-e RABBITMQ_DEFAULT_USERusername \# 指定密码-e R…

python数据可视化:显示两个变量间的关系散点图scatterplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python数据可视化: 显示两个变量间的关系 散点图 scatterplot() [太阳]选择题 请问关于以下代码表述错误的选项是? import seaborn as sns import matplotlib.pyplot …

EPAI手绘建模APP编辑模型2

⑩ 桥接,选择两个面。桥接完成后,在选择的两个面之间生成了一个边界放样模型,边界放样模型和原模型合并成一个新的模型。 图 213 桥接 ⑪ 移除特征,选择倒圆角面、倒直角面、挖孔面、凸起面,移除。移除特征后&#xff…

图像处理ASIC设计方法 笔记21 标记ASIC的顶层状态机

目录 (一)标记ASIC的工作流程1 ASIC首先从控制寄存器内读出待标记图像的基本参数2若写入了有效的启动命令,则进入下面一帧图像的标记过程。3 ASIC通过接口模块从FIFO1中读取待标记的图像4一帧图像初步标记完成后进行等价表的整理压缩5从临时标记存储器中读取临时标记送入标记…

【iOS】KVC

文章目录 前言一、KVC常用方法二、key与keypath区别key用法keypath用法 三、批量存值操作四、字典与模型相互转化五、KVC底层原理KVC设值底层原理KVC取值底层原理 前言 KVC的全称是Key-Value Coding,翻译成中文叫做键值编码 KVC提供了一种间接访问属性方法或成员变…