Wirtinger Flow算法的matlab实现和python实现

article/2025/8/28 3:07:11

文章目录

  • 1. 数学模型
  • 2. Wirtinger Flow 算法
    • 2.1. 光谱初始化方法
    • 2.2. Wirtinger梯度下降
  • 3. 算法实现
    • 3.1. Matlab实现
    • 3.2. Python实现
  • 参考文献

1. 数学模型

观测数学模型可由下面公式给出
y = ∣ A x ∣ 2 y = |Ax|^2 y=Ax2
其中 x ∈ C n x\in\mathbb C^{n} xCn A ∈ C m × n A\in\mathbb C^{m\times n} ACm×n y ∈ R m y\in\mathbb R^{m} yRm

所以我们要求解的问题可归为如下非凸最小二乘问题
min ⁡ z ∈ C n f ( z ) = 1 2 ∥ ∣ A z ∣ 2 − y ∥ 2 2 \min_{z\in\mathbb C^{n}} \;f(z)=\frac12\Bigl\|\,|Az|^{ 2}-y\Bigr\|_2^{2} zCnminf(z)=21 Az2y 22

2. Wirtinger Flow 算法

该算法可以总结成两步:1. 光谱初始化 2. Wirtinger梯度下降

2.1. 光谱初始化方法

具体步骤如下:

  1. 能量标定系数
    λ 2 = n 1 m ⁣ ⊤ y ∥ A ∥ F 2 \lambda^{2} \;=\; n\,\frac{\mathbf 1_{m}^{\!\top}y}{\|A\|_{F}^{2}} λ2=nAF21my

  2. 构造自伴矩阵
    Y = 1 m A ∗ diag ⁡ ( y ) A Y \;=\; \frac1m\,A^{*}\operatorname{diag}(y)\,A Y=m1Adiag(y)A
    求得其最大特征向量 v v v

  3. 缩放得到初始点
    z 0 = λ v z_{0}=\lambda\,v z0=λv

2.2. Wirtinger梯度下降

更新公式如下:
z τ + 1 = z τ − μ τ + 1 ∥ z 0 ∥ 2 2 ( 1 m A ∗ [ ( ∣ A z τ ∣ 2 − y ) ⊙ ( A z τ ) ] ) ⏟ ∇ f ( z τ ) z_{\tau+1} =\;z_\tau\;-\;\frac{\mu_{\tau+1}}{\|z_0\|_{2}^{2}}\; \underbrace{\Bigl(\frac1m\,A^{*}\bigl[\,(|A z_\tau|^{2}-y)\;⊙\;(A z_\tau)\bigr]\Bigr)}_{\nabla f(z_\tau)} zτ+1=zτz022μτ+1f(zτ) (m1A[(Azτ2y)(Azτ)])
公式中的 μ \mu μ更新根据经验公式
μ τ = min ⁡ ( 1 − exp ⁡ ( − τ / τ 0 ) , 0.2 ) , τ 0 ≈ 330 \mu_\tau=\min(1-\exp(-\tau/\tau_0),\,0.2),\quad \tau_0≈330 μτ=min(1exp(τ/τ0),0.2),τ0330

3. 算法实现

3.1. Matlab实现

clear; close all; clc
%% Measurement model 
% Signal length
n = 128; 
% Complex signal
x = randn(n,1) + 1i*randn(n,1);                     % measurement number  
m = 5 * n; 
% Measurement matrix
A = 1/sqrt(2)*randn(m,n) + 1i/sqrt(2)*randn(m,n); 
% Measured values
y = abs(A*x).^2 ;                                   %% Initialization
% power method to get the initial guess
npower_iter = 50;% Scaled coefficient lambda
lam = sqrt(n * sum(y) / norm(A, 'fro')^2);% Random input
z0 = randn(n,1); z0 = z0/norm(z0,'fro');
for tt = 1:npower_iterz0 = 1/m * A'*(y .* (A*z0));z0 = z0/norm(z0,'fro');
end% Initialized ouput
z = lam * z0;%% Gradient update
% Max number of iterations
max_iter = 2500;% update mu
tau0 = 330;                         
mu = @(t) min(1-exp(-t/tau0), 0.2); % Store relative errors
relative_error = zeros(max_iter, 1);for tt = 1:max_iter  Az = A*z;% Wirtinger gradientgrad  = 1/m* A'*( ( abs(Az).^2-y ) .* Az ); % ||z0||=lamz = z - mu(tt)/lam^2 * grad;            % Calculate relative error valuerelative_error_val = norm(x - exp(-1i*angle(trace(x'*z))) * z, 'fro')/norm(x,'fro');relative_error(tt) = relative_error_val;  
end
%%
figure,semilogy(relative_error,'LineWidth',1.8, 'Color',[0 0.4470 0.7410])
xlabel('Iteration','FontSize',16,'FontName','Times New Roman')
ylabel('Relative error','FontSize',16,'FontName','Times New Roman')
title('Wirtinger Flow Convergence','FontSize',16,'FontWeight','bold')

在这里插入图片描述

3.2. Python实现

import numpy as np
import matplotlib.pyplot as pltn = 128                                        # 信号长度
x = np.random.randn(n) + 1j * np.random.randn(n)   # 复值真信号m = 5 * n                                      # 测量数
A = (np.random.randn(m, n) + 1j * np.random.randn(m, n)) / np.sqrt(2)y = np.abs(A @ x) ** 2                         # 强度观测 |Ax|^2# ---------- Initialization (power method) ------------------------------------
npower_iter = 50                               # 幂迭代次数
lam = np.sqrt(n * y.sum() / np.linalg.norm(A, "fro") ** 2)  # λz0 = np.random.randn(n) + 1j * np.random.randn(n)
z0 /= np.linalg.norm(z0)for _ in range(npower_iter):z0 = (A.conj().T @ (y * (A @ z0))) / mz0 /= np.linalg.norm(z0)z = lam * z0                                   # 初值# ---------- Gradient update ---------------------------------------------------
max_iter = 2500
tau0 = 330.0
rel_err = np.zeros(max_iter)for tt in range(max_iter):mu = min(1.0 - np.exp(-(tt + 1) / tau0), 0.2)   # 步长 μ_tAz = A @ zgrad = (A.conj().T @ ((np.abs(Az) ** 2 - y) * Az)) / mz = z - (mu / lam ** 2) * grad# 相对误差theta = np.angle(np.vdot(x, z))           # vdot = x* · zrel_err[tt] = np.linalg.norm(x - np.exp(-1j * theta) * z) / np.linalg.norm(x)# ---------- plot -------------------------------------------------------
plt.figure(figsize=(6.2, 4.2), facecolor="w")
plt.semilogy(rel_err, lw=1.8, color=(0.0, 0.447, 0.741))
plt.xlabel("Iteration", fontsize=13)
plt.ylabel("Relative error", fontsize=13)
plt.title("Wirtinger Flow Convergence (1-D)", fontsize=15, weight="bold")
plt.grid(ls="--", alpha=0.3)
plt.tight_layout()
plt.show()

在这里插入图片描述

参考文献

Candes E J, Li X, Soltanolkotabi M. Phase retrieval via Wirtinger flow: Theory and algorithms[J]. IEEE Transactions on Information Theory, 2015, 61(4): 1985-2007.


http://www.hkcw.cn/article/uQiaNyCWoR.shtml

相关文章

QT+opecv如何更改图片的拍摄路径

如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…

常见的国密加密算法(M1/M2/M3/M4)

国密加密算法 SM2(非对称加密算法) 类型:是非对称加密算法,基于椭圆曲线密码实现。特点:包括有数字签名算法、密钥交换协议,公钥加密算法等部分,其中256位的安全强度比RSA 2048位高,但运算速度更快。使用…

Ubuntu系统下Docker部署Dify保姆级教程:实现内网穿透远程访问

文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位开发者朋友,今天我们将开启一项创新实践——基于Ubuntu系统搭建Dify大语言模型开发平台,并通过Docker容器…

MySQL高可用革命:Orchestrator实现零干预的故障转移与智能拓扑管理

MySQL高可用革命:Orchestrator实现零干预的故障转移与智能拓扑管理 凌晨3点,某电商平台的数据库主节点突然宕机,而系统却在30秒内自动切换至备用节点,数百万用户的购物车数据完好无损——这一切的背后,正是Orchestrato…

Github 2025-05-29 Go开源项目日报Top9

根据Github Trendings的统计,今日(2025-05-29统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目9Assembly项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:27…

技能造血破冰中年人就业困局:粤荣职业培训学校与康安堂共筑康养人才直通车

2025年5月28日,广州市白云区粤荣职业培训学校与康安堂(广州)健康产业有限责任公司在广州市白云区正式签署就业合作协议。在当前社会,中年人就业难问题日益凸显。他们面临着家庭和社会的双重压力,却因年龄、技能等因素在就业市场上处于劣势。粤…

notion搭建个人知识管理库

nullhttps://www.bilibili.com/video/BV1Ur4y1L77m/?spm_id_from333.337.search-card.all.click&vd_source5434ba52b45e69a8650762bf71d67608 一、视频教程:如何搭建个人管理数据库,包括目标管理、知识管理、任务管理等功能,以及如何创建表格和设置…

EC800X QuecDuino开发板介绍

支持的模组列表 EG800KEC800MEC800GEC800E 功能列表 基本概述 EC800X QuecDuino EVB 搭载移远 EC800 系列模组。支持模组型号为: EC800M 系列、EC800K 系列、EG800K 系列、EC800E 系列等。 渲染图 开发板的主要组件、接口布局见下图 资料下载 EC800X-QuecDui…

CC攻击的种类与特点解析

CC攻击(Challenge Collapsar)是一种针对Web应用层的分布式拒绝服务(DDoS)攻击,通过模拟合法用户请求耗尽服务器资源,导致服务不可用。以下是其核心种类及特点的详细分析: 一、CC攻击的种类 代理…

Vite打包优化实践:从分包到性能提升

前言: ​​​​​​​ 随着前端应用功能的增加,项目的打包体积也会不断膨胀,影响加载速度和用户体验。本文介绍了几种常见的打包优化策略,通过Vite和相关插件,帮助减少项目体积、提升性能,优化加载速度。 rollup-plugi…

深度解析 9 大 UI 设计风格

1. 扁平化设计 (Flat Design) 特点: 简洁明了: 移除了阴影、渐变、纹理等三维效果,强调二维平面元素。色彩鲜明: 常用大胆、明亮的色彩。极简主义: 专注于功能性,减少不必要的装饰。排版清晰: 强调大字体和清晰的文本。易于响应: 扁平化设计在不同屏幕尺…

信号与系统速成-1.绪论

b站浙大教授虽然讲的比较细,但是太慢了,不适合速成 祖师爷奥本海姆的MIT课程好像和我们教材的版本不太匹配,但是讲的很不错 慕课上也有很多资源,比如信号与系统 - 网易云课堂 同站博主篱笆外的xixi的文章也挺不错 最终我还是选…

WPF prism

Prism Prism.Dryloc 包 安装 Nuget 包 - Prism.DryIoc 1. 修改 App.xaml 修改 App.xaml 文件&#xff0c;添加 prism 命名空间, 继承由 Application → PrismApplication&#xff0c;删除默认启动 url, StartupUri“MainWindow.xaml” <dryioc:PrismApplicationx:Class…

Shell 脚本

注&#xff1a;文章参考《鸟哥的linux私房菜》、通义千问AI产品 认识 Shell Linux 中的 Shell 就是 linux 内核的一个外层保护工具&#xff0c;并负责完成用户与内核之间的交互。 Shell 可以分为以下几类&#xff1a; Bourne Shell &#xff08;简称 sh&#xff09;C Shell…

Win11安装Dify

1、打开Virtual Machine Platform功能 电脑系统为&#xff1a;Windows 11 家庭中文版24H2版本。 打开控制面板&#xff0c;点击“程序”&#xff0c;点击“启用或关闭Windows功能”。 下图标记的“Virtual Machine Platform”、“适用于 Linux 的 Windows 子系统”、“Windows…

自动化立体仓库堆垛机SRM控制系统FC19手动控制功能块开发

1、控制系统手动控制模块HMI屏幕设计如下图 屏幕分为几个区域:状态显示区、控制输入区、导航指示区、报警信息区。状态显示区需要实时反馈堆垛机的位置、速度、载货状态等关键参数。控制输入区要有方向控制按钮,比如前后左右移动,升降控制,可能还需要速度调节的滑块或选择按…

软件无线电技术之基带QPSK 调制技术+扩频技术

基带QPSK 调制技术 数字正交调制以0、1 比特流为调制信号&#xff0c;其过程就是将原始数据按照一定的规则映射至IQ 坐标系&#xff0c;而后经过DAC 转为模拟信号后才能进行后续的IQ 调制。 数字IQ 调制完成了符号到矢量坐标系的映射&#xff0c;映射点一般称为星…

图像数据与显存

一、 图像数据的介绍 1.1 灰度图像 从这里开始我们进入到了图像数据相关的部分&#xff0c;也是默认你有之前复试班计算机视觉相关的知识&#xff0c;但是一些基础的概念我仍然会提。 昨天我们介绍了minist这个经典的手写数据集&#xff0c;作为图像数据&#xff0c;相较于结…

opencut:如何用AI工具把中文图片/视频翻译成英语、日语、俄语等100多种语言!

在全球化背景下&#xff0c;无论是学习、工作还是生活&#xff0c;多语言翻译需求日益增长。从跨境电商产品图的本地化适配&#xff0c;到学习资料的快速翻译&#xff0c;传统人工翻译不仅成本高、耗时长&#xff0c;还可能因文化差异导致误解。 今天为大家分享一款高效实用的 …

揭开帕金森的神秘面纱

帕金森是一种常见的神经退行性疾病&#xff0c;多在中老年群体中出现&#xff0c;平均发病年龄约 60 岁。它主要是由于脑内特定区域产生多巴胺的神经细胞退化&#xff0c;导致多巴胺分泌减少&#xff0c;从而影响了人体的运动和其他生理功能。 这种疾病最典型的表现是运动症状&…