编码衍射模型的 Wirtinger 梯度下降算法
考虑相位恢复问题:
$$ \min_z \;\; f(z):=\displaystyle\frac{1}{2}\displaystyle\sum_{j=(1,1)}^{(n,L)} \left(|\bar{a}_j^\top z|^2-b_j\right)^2, $$
其中 为采样向量。在到编码衍射模型中,则为
为一系列已知的采样信号, 为原始信号, 是观测的模长。
目标函数的 Wirtinger 导数为:
利用 Wirtinger 导数构造梯度下降算法求解相位恢复问题。
目录
初始化和迭代准备
输入信息:迭代初始点 ,观测模长 ,采样信号 ,原始数据 和停机准则 stop_cri 。 输出信息: 迭代得到的解 (其为真实信号 的恢复),包含迭代信息的结构体 info 。
- info.eff:每一步迭代的相对误差
- info.time:每一步迭代的 cpu 时间
- info.prod:矩阵向量积的次数
- info.ite:总迭代次数
- info.state:标记是否收敛
function [ z, info ] = WF_C( z0, y, A, x, stop_cri)
参数设定,最大迭代次数 2000 次。 和 mumax 为步长相关的参数。
T=cputime; ite_max=2000; tau0=330;mumax=0.2;
将向量化的采集信号 转化为 的矩阵
[n,L]=size(A); y=reshape(y,n,L); m=n*L;
计算信号 的在衍射变换下的结果: 。 注意到 MATLAB 函数 fft 对于矩阵输入,逐列计算一维的离散傅里叶变换。
rsd=fft(conj(A).*(z0*ones(1,L))); l=norm(z0,2)^2; ite=0; z=z0;
相对误差:
其中 用表示 与 之间的夹角。当 时,该相对误差为 。
relerr=norm(x-exp(-1i*angle(trace(x'*z)))*z,'fro')/norm(x,'fro'); info.err=relerr; info.time=[0]; info.prod=[1]; prod=1;
迭代主循环
达到收敛条件:相对误差 小于阈值 stop_cri , 或者迭代次数超过最大迭代次数 ite_max 限制,停止迭代。
while relerr>stop_cri && ite<ite_max
第 步的步长选取为 , 这里 。
mu=min(1-exp(-(ite+1)/tau0),mumax); alpha = mu/l;
由 Wirtinger 导数,有
计算矩阵 t,其 元素为
t=(abs(rsd).^2-y).*rsd;
计算梯度 。
D=mean(A.*ifft(t),2);
% 梯度下降。
z=z-alpha*D;
迭代步数加一,更新残差的傅里叶变换 rsd 和相对误差 。 更新迭代信息,记录当前步的相对误差、cpu 时间、矩阵向量积次数。
ite=ite+1; rsd=fft(conj(A).*(z*ones(1,L))); relerr=norm(x-exp(-1i*angle(trace(x'*z)))*z,'fro')/norm(x,'fro'); info.err=[info.err,relerr]; info.time=[info.time,cputime-T]; prod=prod+2; info.prod=[info.prod,prod]; end
当迭代退出时,记录总迭代步。并以 info.state 记录退出原因(是否达到收敛而退出迭代)。
info.ite=ite; if ite==ite_max info.state=0; else info.state=1; end
end
参考页面
我们在页面 实例:编码衍射模型 中展示了该算法的一个应用,并将其与其它算法进行比较。
此页面的源代码请见: WF_C.m。
版权声明
此页面为《最优化:建模、算法与理论》、《最优化计算方法》配套代码。 代码作者:文再文、刘浩洋、户将,代码整理与页面制作:杨昊桐。
著作权所有 (C) 2020 文再文、刘浩洋、户将