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

news/2024/5/20 6:35:41

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:nitersigma = 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:maxiterx_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)]

7、根据论文复现AMPA算法

AMP0和AMPA分别用于BP和BPDN,后者更为通用性,多了一个正则化参数项

function [x_est] = AMP_Lplace(y,A,maxiter,lambda)
%%根据论文写的AMPA算法,效果没有之前的GitHub上的好
[M,N]=size(A);
%% Approximate Message Passing for Laplace Prio
% Initializing
x_est = zeros(N,1);
z = y;
tau=1;
if nargin<4
lambda=0;% regularization parameter
end
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:maxiterx_est = etafunc(x_est + A'*z, tau+lambda);z = y - A*x_est + 1/delta*z.*mean(etafuncdiff(x_est + A'*z,tau+lambda));tau = (lambda+tau)/delta*mean(etafuncdiff(x_est + A'*z,tau+lambda));
end

算法感觉不太稳定,有时候会发散。效果还是没有Github上给的代码好。Github上给的代码好像利用了噪声的标准差

 sigma = norm(z,2)/sqrt(M);

至于为什么,还需要进一步探索。


http://www.mrgr.cn/p/07585188

相关文章

给网站网页PHP页面设置密码访问代码

将MkEncrypt.php文件上传至你网站根目录下或者同级目录下。 MkEncrypt.php里面添加代码&#xff0c;再将调用代码添加到你需要加密的页进行调用 MkEncrypt(‘123456’);括号里面123456修改成你需要设置的密码。 密码正确才能进去页面&#xff0c;进入后会存下cookies值&…

22_Scala集合Seq

文章目录 Seq序列1.构建集合2.List集合元素拼接&&集合拼接3.可变Seq&&List3.1 ListBuffer创建3.2 增删改查3.3 相互转化 Appendix1.Scala起别名2.Seq底层3.关于运算符操作: :4.空集合的表示 Seq序列 –Seq表示有序&#xff0c;数据可重复的集合 1.构建集合 …

ReactFlow的ReactFlow实例事件传参undefined处理状态切换

1.问题 ReactFlow的ReactFlow实例有些事件我们在不同的状态下并不需要&#xff0c;而且有时候传参会出现其它渲染效果&#xff0c;比如只读状态下我们不想要拖拉拽onEdgesChange连线重连或删除的功能。 2.思路 事件名称类型默认值onEdgesChange(changes: EdgeChange[]) >…

Java面试重点之反射机制

一、 反射是什么&#xff1f; 允许程序在运行时查询和操作对象的类型信息。通过反射&#xff0c;程序能够在运行时获取对象的类定义信息&#xff0c;如类的名称、方法、字段、注解等&#xff0c;并且可以动态地调用对象的方法或访问其字段&#xff0c;而无需在编译时具体知道对…

【SQL每日一练】统计复旦用户8月练题情况

文章目录 题目一、分析二、题解1.使用case...when..then2.使用if 题目 现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况&#xff0c;请取出相应明细数据&#xff0c;对于在8月份没有练习过的用户&#xff0c;答题数结果返回0. 示例代码&am…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

企业车辆管理系统参考论文(论文 + 源码)

【免费】关于企业车辆管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89282550 企业车辆管理系统 摘 要 随着经济的日益增长,车辆作为最重要的交通工具,在企事业单位中得以普及,单位的车辆数目已经远远不止简单的几辆,与此同时就产生了车辆资源的合理…

JavaScript异步编程——05-回调函数

我们在前面的文章《JavaScript 基础&#xff1a;异步编程/单线程和异步》中讲过&#xff0c;Javascript 是⼀⻔单线程语⾔。早期我们解决异步场景时&#xff0c;⼤部分情况都是通过回调函数来进⾏。 &#xff08;如果你还不了解单线程和异步的概念&#xff0c;可以先去回顾上一…

OpenVX技术图例(二)

OpenVX技术图例(二) 参考文献链接 https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/latest/exports/docs/tiovx/docs/user_guide/index.html人工智能芯片与自动驾驶

贪吃蛇小游戏(c语言)

1.效果展示 屏幕录制 2024-04-28 205129 2.基本功能 • 贪吃蛇地图绘制 • 蛇吃食物的功能 &#xff08;上、下、左、右方键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 3.技术要点 C语言函数、枚举、结构…

(7)ram ip使用

一、ram相关介绍 本实验使用一个控制模块对ram ip进行控制(本质上是三个计数器) 二、ip使用 在界面中选择IP catalog,搜索block,选择底下这个,双击即可生成ram的ip下面进行一些ram资源的配置 配置好后点击ok,生成ip,可以在这里看到已经生成好了: 这里点开这个.veo文件,…

深入了解 NumPy:深度学习中的数学运算利器

文章目录 1. 导入NumPy2. 创建NumPy数组3. 数组的算术运算4. N维数组4.1 创建和操作多维数组4.2 高维数组 5. NumPy的广播功能5.1 基本广播示例5.2 更复杂的广播示例 6. 访问数组元素6.1 基于索引的访问6.2 遍历数组6.3 基于条件的访问6.4 高级索引6.5 性能考虑 在深度学习和数…

Crowd counting 系列NO.2—MCNN

声明&#xff1a;博客是用latex写的&#xff0c;所以直接用图片来展示吧&#xff0c;效果是一样的。下载资源网上都很容易搜到&#xff0c;如需下载资源&#xff0c;请留言。

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java&#xff0c;真的吗&#xff1f;唉&#xff0c;先把这视频干完吧。 逻辑运算符练习 x6&#xff0c;y6 x6&#xff0c;y5 x11&#xff0c;y6 x11&#xff0c;y5 z48 错了&a…

超级大转盘!(html+less+js)(结尾附代码)

超级大转盘&#xff01;&#xff08;结尾附代码&#xff09; 网上看到有人用转盘抽奖&#xff0c;怀疑是不是有问题&#xff0c;为什么每次都中不了&#xff0c;能不能整个转盘自己想中啥中啥&#xff0c;查阅了网上写得好的文章&#xff0c;果然实现了只中谢谢参与&#xff0…

《21天学通C++》(第十二章)运算符类型与运算符重载

1.为什么要重载运算符&#xff1f; 通过重载运算符&#xff0c;可以将复杂的操作封装成简单的运算符形式&#xff0c;简化代码&#xff0c;提高可读性下面举一个简单的例子 计算两个点的坐标之和。 1.不重载运算符 #include <iostream> using namespace std; class P…

低功耗数字IC后端设计实现典型案例| UPF Flow如何避免工具乱用Always On Buffer?

下图所示为咱们社区低功耗四核A7 Top Hierarchical Flow后端训练营中的一个案例&#xff0c;设计中存在若干个Power Domain&#xff0c;其中Power Domain2(简称PD2)为default Top Domain&#xff0c;Power Domain1&#xff08;简称PD1&#xff09;为一个需要power off的domain&…

STM32单片机实战开发笔记-I2C通讯总线【wulianjishu666】

嵌入式单片机开发实战例程合集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11av8rV45dtHO0EHf8e_Q0Q?pwd28ab 提取码&#xff1a;28ab I2C模块测试 功能描述 I2C总线接口连接微控制器和串行I2C总线。它提供多主机功能&#xff0c;控制所有I2C总线特定的时序&am…

云HIS源码,基于云计算的医院临床信息系统(有应用案列)

云HIS全套商业源码&#xff0c;基于云计算的医院临床信息系统 提供预约挂号、门急诊收费、门诊医生站、护士工作站、药房药库管理、电子病历、住院医生站、住院护士工作站、住院登记结算、出院管理、病案管理、医药价格管理、财务管理、统计查询、会员管理等业务及管理功能。 …

【Android】Room数据库的简单使用方法

Room数据库的使用方法 目录 1、添加Room数据库的依赖2、Entity——定义实体类 2.1 定义主键——PrimaryKey2.2 字段注解——ColumnInfo 3、Dao——定义数据访问对象4、Database——数据库 4.1 通过回调观察数据库是否创建成功 5、使用时注意点6、编写异步 DAO 查询 6.1 写异步…