MATLAB实现低秩矩阵填充

news/2025/11/3 11:02:44/文章来源:https://www.cnblogs.com/wiwi1313/p/19186474

MATLAB实现低秩矩阵填充,整合了三种经典的方法

方法名称 核心原理 适用场景 优点 缺点
基于SVD的迭代硬阈值 迭代过程中保留前k个奇异值,强制矩阵低秩 已知矩阵真实秩的情况;数据量不大时 原理简单,收敛性强 需要知道矩阵的秩,计算量大
基于梯度下降的矩阵分解 将矩阵分解为两个小矩阵,优化其乘积与已知元素的误差 大规模矩阵;推荐系统 不需要知道矩阵的秩,速度较快 容易陷入局部最优
基于凸优化的奇异值阈值 用核范数(奇异值之和)近似矩阵的秩,进行优化 矩阵秩未知;理论保证强的恢复 恢复性能好,理论完善 计算速度慢,迭代次数多

基于SVD的迭代硬阈值法

这种方法假设你已知矩阵的真实秩。它通过迭代的方式,在每一步都对矩阵进行SVD分解,只保留前k个最大的奇异值,从而强制矩阵保持低秩状态。

function X_hat = svd_iterative_impute(X, k, max_iters, tol)% X: 包含NaN值的观测矩阵% k: 假设的矩阵秩% max_iters: 最大迭代次数% tol: 收敛阈值% 初始化:用0填充缺失值X_hat = X;missing_mask = isnan(X);X_hat(missing_mask) = 0;for iter = 1:max_itersX_prev = X_hat;% SVD分解[U, S, V] = svd(X_hat, 'econ');% 硬阈值:只保留前k个奇异值S_k = S;S_k(k+1:end, k+1:end) = 0;% 重构矩阵X_hat = U * S_k * V';% 确保已知元素不变X_hat(~missing_mask) = X(~missing_mask);% 检查收敛if norm(X_hat - X_prev, 'fro') / norm(X_prev, 'fro') < tolfprintf('SVD迭代在第%d次收敛。\n', iter);break;endend
end

基于梯度下降的矩阵分解法

该方法将原始矩阵分解为两个小矩阵(用户矩阵和物品矩阵)的乘积,通过梯度下降最小化已知位置上的预测误差。这种方法在推荐系统中非常常用。

function [P, Q] = matrix_factorization_impute(X, k, max_iters, learning_rate, lambda)% X: 包含NaN的观测矩阵% k: 隐特征维度% max_iters: 最大迭代次数% learning_rate: 学习率% lambda: 正则化参数% 初始化P和Q[m, n] = size(X);P = rand(m, k);Q = rand(n, k);% 找到非NaN元素的位置和值[row, col, values] = find(~isnan(X));obs_idx = [row, col];fprintf('开始梯度下降...\n');for iter = 1:max_iterstotal_error = 0;% 随机打乱观测顺序idx = randperm(length(values));for i = 1:length(idx)r = row(idx(i));c = col(idx(i));true_val = X(r, c);% 预测值pred_val = P(r, :) * Q(c, :)';error = pred_val - true_val;total_error = total_error + error^2;% 梯度更新P_temp = P(r, :);P(r, :) = P(r, :) - learning_rate * (error * Q(c, :) + lambda * P(r, :));Q(c, :) = Q(c, :) - learning_rate * (error * P_temp + lambda * Q(c, :));end% 计算总损失total_loss = total_error / length(values) + (lambda/2) * (norm(P, 'fro') + norm(Q, 'fro'));if mod(iter, 100) == 0fprintf('迭代 %d, 损失: %.6f\n', iter, total_loss);endend
end

基于凸优化的奇异值阈值法

该方法不直接优化秩(这是个非凸问题),而是优化矩阵的核范数(所有奇异值之和),这是秩的凸近似。通过软阈值方法迭代地更新矩阵。

function X_hat = svt_impute(X, tau, delta, max_iters, tol)% X: 包含NaN的观测矩阵% tau: 阈值参数% delta: 步长% max_iters: 最大迭代次数% tol: 收敛阈值% 初始化X_hat = zeros(size(X));missing_mask = isnan(X);Y = zeros(size(X));% 将缺失值位置设为0X_known = X;X_known(missing_mask) = 0;for iter = 1:max_itersX_prev = X_hat;% SVD分解[U, S, V] = svd(Y, 'econ');% 软阈值操作S_soft = sign(S) .* max(abs(S) - tau, 0);% 更新矩阵估计X_hat = U * S_soft * V';% 更新Y(只修正已知元素)Y = Y + delta * (X_known - X_hat .* ~missing_mask);% 检查收敛if norm(X_hat - X_prev, 'fro') / (norm(X_prev, 'fro') + eps) < tolfprintf('SVT在%d次迭代后收敛。\n', iter);break;endend
end

完整演示与对比

下面是一个完整的演示代码,展示如何使用这三种方法并比较它们的效果:

% 生成模拟数据
m = 100; n = 100; % 矩阵维度
true_rank = 5; % 真实秩
A_true = randn(m, true_rank) * randn(true_rank, n); % 生成低秩矩阵% 随机隐藏部分元素作为缺失值
obs_ratio = 0.3; % 观测比例
mask = rand(m, n) < obs_ratio;
X_obs = A_true;
X_obs(~mask) = NaN;fprintf('矩阵维度: %d x %d, 真实秩: %d, 观测比例: %.2f\n', ...m, n, true_rank, obs_ratio);% 方法1: 基于SVD的迭代硬阈值
fprintf('\n=== 方法1: SVD迭代硬阈值 ===\n');
tic;
X_svd = svd_iterative_impute(X_obs, true_rank, 500, 1e-6);
time_svd = toc;
error_svd = norm(X_svd - A_true, 'fro') / norm(A_true, 'fro');
fprintf('相对误差: %.6f, 耗时: %.2f秒\n', error_svd, time_svd);% 方法2: 基于矩阵分解
fprintf('\n=== 方法2: 矩阵分解 ===\n');
tic;
[P, Q] = matrix_factorization_impute(X_obs, true_rank, 1000, 0.01, 0.01);
X_mf = P * Q';
time_mf = toc;
error_mf = norm(X_mf - A_true, 'fro') / norm(A_true, 'fro');
fprintf('相对误差: %.6f, 耗时: %.2f秒\n', error_mf, time_mf);% 方法3: 奇异值阈值(SVT)
fprintf('\n=== 方法3: 奇异值阈值(SVT) ===\n');
tic;
X_svt = svt_impute(X_obs, 1, 1.2, 500, 1e-6);
time_svt = toc;
error_svt = norm(X_svt - A_true, 'fro') / norm(A_true, 'fro');
fprintf('相对误差: %.6f, 耗时: %.2f秒\n', error_svt, time_svt);% 结果显示
fprintf('\n=== 结果对比 ===\n');
fprintf('方法                 相对误差          耗时(秒)\n');
fprintf('SVD迭代硬阈值       %.6f          %.2f\n', error_svd, time_svd);
fprintf('矩阵分解            %.6f          %.2f\n', error_mf, time_mf);
fprintf('SVT                 %.6f          %.2f\n', error_svt, time_svt);

参考代码 各种低秩约束矩阵填充方法 www.youwenfan.com/contentcnk/78960.html

关键参数选择建议

  1. 目标秩k的选择

    • 如果知道真实秩,直接使用
    • 否则可以使用特征值衰减观察法:plot(svd(X_known)),寻找拐点
  2. SVT方法参数

    • tau:通常取矩阵大小的倍数,如 tau = 5 * (m+n)/2
    • delta:通常在1.0-1.5之间
  3. 矩阵分解参数

    • 学习率:0.001-0.1,需要尝试
    • 正则化参数:0.01-0.1防止过拟合

实际应用技巧

  1. 数据预处理:对已知元素进行归一化可以显著提高性能
  2. 缺失模式:对于非均匀缺失的情况,可能需要更多迭代
  3. 收敛判断:可以观察重构误差的变化情况来调整迭代次数

这三种方法各有优劣,你可以根据具体问题选择最适合的方案。

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

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

相关文章

基于模糊控制理论的锅炉水位控制系统设计与仿真

一、框架 1. 控制系统架构 graph TDA[水位传感器] -->|实时监测| B(水位偏差e)C[蒸汽流量计] -->|前馈补偿| DB -->|输入模糊控制器| ED -->|动态补偿| EE -->|输出控制量| F(变频给水泵)F -->|调节…

CSPS AK大佬游记拜读

ak大佬游记拜读: https://www.cnblogs.com/dcytrl/p/19186457

喵喵喵 I

喵喵喵 ICOMC 2025COMC 2025 填空压轴:假设两个多项式 \(p(x)=\sum_{i=0}^{100}a_ix^i,q(x)=\sum_{i=0}^{100}b_ix^i\),并且 \(a\) 和 \(b\) 满足存在正整数 \(j,k\in[0,100]\),满足 \(\forall i\in[0,100]\cup\mat…

2025年真空泵维修可靠公司排名:真空泵维修哪家可靠

在工业生产和科研领域,真空泵是众多设备运行的关键辅助设备。然而,真空泵在使用过程中,常常会遇到诸如泵达不到极限压强、运行中温度过高、噪音过大、抽速太慢以及真空管道或被抽容器中发现油等问题,这时候就急需专…

跨网文件传输系统:打通半导体数据流转的任督二脉

在数字经济时代,半导体行业作为科技产业的核心支柱,其研发数据、工艺参数、芯片设计图纸等核心资产直接决定企业竞争力与国家科技安全。为保护核心数据,半导体企业普遍将内部网络隔离划分为研发网、生产网、办公网、…

RMAN备份功能详解

RMAN备份功能详解一、Backupset 备份集 1. 完整数据库备份 基本完整备份 RMAN> backup database format=/u01/myrman/prod_%s.bak;完整备份包含归档日志 RMAN> backup database plus archivelog delete all inpu…

添加水印class封装

const _x = Symbol(x) const _body = Symbol(body) const _base64Url = Symbol(base64Url) class Watermark {props: any;// targetNode: HTMLElement | null;// base64Url: string;// bodyWapper: any;// observerDat…

企业级AI知识库到底能做什么?PandaWiki重新定义知识生产力

企业级AI知识库到底能做什么?PandaWiki重新定义知识生产力“我们公司有海量的产品文档,但员工找份资料要花半小时…” “技术团队的经验都藏在个人电脑里,新人来了根本无从下手…” “客户咨询个简单问题,客服要翻…

对象存储系统MinIO详细以及部署

MinIO是一款开源高性能对象存储系统,核心特性包括100%兼容AWS S3 API、高可靠性(多副本/纠删码)、安全认证和易用部署。主要应用于非结构化数据存储、云原生架构配套、私有云替代等领域。支持单机和分布式两种部署模…

基于模拟电荷法的MATLAB输电线路铁塔电场分布计算

基于模拟电荷法(Charge Simulation Method, CSM)的MATLAB输电线路铁塔电场分布计算一、算法原理基本假设 导体表面电荷等效为离散线电荷 大地采用镜像法处理(单层均匀土壤) 忽略空气电离效应(工频场强<30kV/m)…

Jmeter汉化成中文版

1、jmeter安装成功后,默认启动是英文版 2、汉化方法 到jmeter安装目录下找到\bin\jmeter.properties,右键记事本打开定位“#language=en”,复制新增一行去掉注释“language=zh_CN”,保存文件 3、重启jmeter,显示为…

2025年新疆地坪厂家权威推荐榜单:环氧树脂地坪漆/环氧彩砂地坪/透水地坪源头厂家精选

在地坪行业竞争日益激烈的今天,新疆地区的地坪厂家凭借不断提升的技术实力和持续创新的产品体系,在区域市场中形成了独特的竞争优势。 据行业报告显示,中国地坪行业市场规模正以年均复合增长率超过8% 的速度持续扩张…

用docker搭建selenium grid分布式环境

使用Docker搭建Selenium Grid分布式环境的实践步骤:安装Docker:首先,确保您已经安装了Docker引擎。可以根据您的操作系统选择适当的安装方法并完成安装。 编写Docker Compose文件:创建一个名为docker-compose.yml的…

MATLAB动态规划设备分配

MATLAB动态规划设备分配 通过动态规划有效解决了设备分配问题,在MATLAB中可实现从基础到优化的完整解决方案。实际应用中建议结合实验数据对收益矩阵进行标定,并通过可视化工具分析分配模式。一、问题建模(设备分配…

一文掌握RMAN基础入门:核心概念、环境配置与命令格式全解析

一文掌握RMAN基础入门:核心概念、环境配置与命令格式全解析RMAN(Recovery Manager)是Oracle数据库专用的备份与恢复管理工具,凭借块级备份、自动校验、增量备份等优势,成为数据库运维中保障数据安全的核心工具。本…

UNI-APP设计电池电量显示

UNI-APP设计电池电量显示 1 <template>2 3 <view class="agv-footer">4 <view class="battery-info">5 <view class="battery-ic…

2025年知名的异型轴承座实力厂家TOP推荐榜

2025年知名的异型轴承座实力厂家TOP推荐榜 在工业制造领域,轴承座作为机械设备的关键部件,直接影响设备的运行稳定性和使用寿命。异型轴承座因其特殊的设计和定制化需求,对生产厂家的技术实力、制造工艺和售后服务…

2025 年 11 月皮拉尼真空计,单晶炉真空计厂家最新推荐,技术实力与市场口碑深度解析

引言 在光伏、半导体等高端制造领域,皮拉尼真空计与单晶炉真空计作为核心测量设备,其精度与稳定性直接决定生产工艺的可控性与产品合格率。据仪器仪表行业协会 2025 年报告显示,相关市场规模已达 86.3 亿元,国产化…

springboot 读取配置文件方式

------------------------------------------------------------------------------------------------------------ 在 Spring Boot 中,读取配置文件是非常常见的操作,配置文件通常包括 application.properties、ap…

启动Coze报了一个elasticsearch启动错误

排查是因为analysis-smartcn.zip 被公司 自动加密了,导致elasticsearch无法解析这个插件 解决办法:下载smartcn, 直接浏览器访问地址,根据当前es版本号替换地址中analysis-smartcn-{x.x.x}.zip https://artifacts.e…