MATLAB实现K-SVD算法

简介: MATLAB实现K-SVD算法

一、核心代码实现

%% K-SVD算法主函数
function [D, X] = ksvd(Y, K, L, numIter)
    % 输入参数:
    % Y - 输入信号矩阵 (n x N)
    % K - 字典原子数
    % L - 最大稀疏度
    % numIter - 迭代次数
    % 输出参数:
    % D - 学习字典 (n x K)
    % X - 稀疏系数矩阵 (K x N)

    [n, N] = size(Y);

    % 初始化字典(DCT字典)
    D = dctmtx(n)';
    D = D(:,1:K); % 截取前K列
    D = D ./ vecnorm(D); % 列归一化

    % 初始化稀疏系数
    X = omp(D, Y, L);

    % 迭代优化
    for iter = 1:numIter
        % 稀疏编码阶段
        X = omp(D, Y, L);

        % 字典更新阶段
        for k = 1:K
            % 找到使用第k个原子的信号索引
            idx = find(X(k,:) ~= 0);
            if isempty(idx)
                continue;
            end

            % 计算残差矩阵
            E = Y(:,idx) - D*X(:,idx) + D(:,k)*X(k,idx);

            % 使用SVD更新原子
            [U, S, V] = svd(E, 'econ');
            D(:,k) = U(:,1);
            X(k,idx) = S(1,1)*V(:,1)';
        end

        % 显示迭代信息
        fprintf('Iteration %d, Reconstruction Error: %.4f\n',...
            iter, norm(Y - D*X,'fro'));
    end
end

%% 正交匹配追踪算法(OMP)
function X = omp(D, y, L)
    [n, K] = size(D);
    P = size(y,2);
    X = zeros(K,P);

    for p = 1:P
        r = y(:,p);
        indx = [];
        for l = 1:L
            proj = D'*r;
            [~, pos] = max(abs(proj));
            indx = [indx, pos];
            A = D(:,indx);
            x = pinv(A)*r;
            r = y(:,p) - A*x;
        end
        X(indx,:) = x;
    end
end

二、完整实现流程

1. 参数设置与数据准备

% 示例参数
n = 8;        % 信号维度
N = 1000;     % 信号数量
K = 50;       % 字典原子数
L = 5;        % 稀疏度
numIter = 10; % 迭代次数

% 生成测试信号(含噪声)
Y_clean = randn(n,N);
Y_noisy = awgn(Y_clean, 10, 'measured'); % SNR=10dB

2. 字典学习与稀疏编码

% 执行K-SVD算法
tic;
[D_learned, X_sparse] = ksvd(Y_noisy, K, L, numIter);
toc;

% 信号重构
Y_recon = D_learned * X_sparse;

% 计算PSNR
psnr_val = 10*log10(n*mean(Y_clean(:).^2)/mean((Y_clean(:)-Y_recon(:)).^2));
fprintf('PSNR: %.2f dB\n', psnr_val);

3. 结果可视化

figure;
subplot(2,2,1);
imagesc(Y_clean);
title('原始信号');
subplot(2,2,2);
imagesc(Y_noisy);
title('含噪信号');
subplot(2,2,3);
imagesc(D_learned);
title('学习字典');
subplot(2,2,4);
imagesc(Y_recon);
title('重构信号 (PSNR=%.2f dB)' format(psnr_val));

三、关键算法解析

1. 字典初始化策略

  • DCT字典:适用于自然图像处理(代码中已实现)

  • 随机初始化:适用于通用场景

    D = randn(n,K);
    D = D ./ vecnorm(D);
    
  • 预训练字典:使用自然图像块初始化(需加载外部数据)

2. 稀疏编码优化

  • OMP算法:保证稀疏性(代码中实现)

  • 正则化OMP:加入L1正则项提升鲁棒性

    function X = omp_l1(D, y, L)
        % 使用L1正则化的OMP实现
        % 需要安装SPAMS工具箱
        X = spams.omp(y, D, 'lambda', 0.1, 'K', L);
    end
    

3. 字典更新机制

  • 逐列更新:通过SVD分解残差矩阵

  • 批量更新:同时更新多个原子(需修改代码)


四、性能优化技巧

优化方法 实现方式 效果提升
GPU加速 使用gpuArray转换数据 5-10倍
并行计算 parfor循环处理不同原子 3-5倍
内存优化 分块处理大规模数据 减少内存占用
收敛条件优化 设置误差阈值提前终止迭代 节省时间

五、应用场景示例

1. 图像去噪

% 加载图像
img = imread('lena.png');
img_gray = rgb2gray(img);
img_vec = double(img_gray(:));

% 添加高斯噪声
sigma = 20;
noisy_img = img_vec + sigma*randn(size(img_vec));

% 字典学习参数
n = 64; % 8x8分块
K = 256;
L = 4;
numIter = 20;

% 分块处理
blocks = im2col(img_vec, [n,n], 'distinct');
[D, X] = ksvd(blocks, K, L, numIter);
denoised_blocks = D * X;
denoised_img = col2im(denoised_blocks, [n,n], size(img_vec), 'distinct');

% 计算PSNR
psnr_denoised = 10*log10(mean(img_vec.^2)/mean((img_vec-denoised_img).^2));

2. 语音信号分离

% 加载混合信号
[y1,fs] = audioread('speech.wav');
[y2,fs] = audioread('music.wav');
mixed = y1 + y2;

% 分帧处理
frame_len = 256;
overlap = 128;
frames = enframe(mixed, frame_len, overlap);

% 字典学习
[D, X] = ksvd(frames, 128, 5, 15);

% 稀疏编码
X_sparse = omp(D, frames, 5);

% 信号分离
separated = D * X_sparse;

参考代码 matlab编写的k-svd算法代码 www.youwenfan.com/contentalh/64871.html

六、代码扩展建议

  1. 多尺度字典:结合小波变换构建多分辨率字典

  2. 动态字典更新:根据信号特性自适应调整原子

  3. 深度学习结合:使用CNN提取特征后进行字典学习

  4. GPU并行实现:利用CUDA加速矩阵运算

相关文章
|
19天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34862 48
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
13天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
12574 37
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
8天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
2609 27
|
30天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45768 157
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
6天前
|
人工智能 弹性计算 安全
Hermes Agent是什么?怎么部署?超详细实操教程
Hermes Agent 是 Nous Research 于2026年2月开源的自进化AI智能体,支持跨会话持久记忆、自动提炼可复用技能、多平台接入与200+模型切换,真正实现“越用越懂你”。MIT协议,部署灵活,隐私可控。
1876 3
|
4天前
|
弹性计算 人工智能 自然语言处理
阿里云Qwen3.6全新开源,三步完成专有版部署!
Qwen3.6是阿里云全新MoE架构大模型系列,稀疏激活显著降低推理成本,兼顾顶尖性能与高性价比;支持多规格、FP8量化、原生Agent及100+语言,开箱即用。
|
1天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。