zoukankan      html  css  js  c++  java
  • 稀疏编码(sparse code)与字典学习(dictionary learning)

    Dictionary Learning Tools for Matlab.

    1. 简介

    字典 DRN×K(其中 K>N),共有 k 个原子,xRN×1 在字典 D 下的表示为 w,则获取较为稀疏的 w 的稀疏逼近问题如下表示:

    wopt=argminwwp+γxDw22p{0,1}

    γ 越大,得到的解越稠密(dense)。

    • p=0,通过 MP(matching pursuit)匹配追踪算法求解,比如 ORMP(order recursive matching pursuit);
    • p=1,通过 LARS 算法求解;
    • ORMP 还是 LARS 均是基于贪心的思路求解;

    2. 字典学习

    在给定训练集 XRN×L 的情况下,字典学习用来求解字典 DRN×Kdi=1,i=1,2,,K),及其对应的系数矩阵 WRK×L,此时的表示误差为 R=XDW

    {Dopt,Wopt}=argminD,W=1Lw+γXDW2

    3. 求解

    • MOD or ILS-DLA

      MOD(Method of Optimized Directions),ILS-DLA(iterative least squares dictionary learning algorithms)

      此时迭代算法的思路分为如下三步:

      • 固定 D,求解 W
      • 固定 W,根据最小二乘法求解 D=(XWT)(WWT)1
      • 归一化 D,也即将其各个列缩放为单位向量;
      for i = 1:noIt
          W = sparseapprox(X, D, 'mexOMP', 'tnz', s);
          D = (X*W')/(W*W');
          D = dictnormalize(D);
      end
    • K-SVD

      K-SVD 也是基于迭代求解思路而提出的算法,迭代主要分为如下两步:

      • 固定 D,求解 W
      • 记录 W 中非零的元素,使用 SVD 分解更新 DW
      % X: N*L, D: N*K, W: K*L
      for i = 1:noIt
          W = sparseapprox(X, D, 'mexOMP', 'tnz', s);
          R = X - D*W;
          for k=1:K
              % 找到非零列
              I = find(W(k, :));
              Ri = R(:, I) + D(:, k)*W(k, I);
              % 奇异值分解
              [U, S, V] = svds(Ri, 1, 'L');
              % 更新
              D(:, k) = U;
              W(k, I) = S*V';
              R(:, I) = Ri - D(:, k)*W(k, I);
          end
      end
  • 相关阅读:
    学习完vue指令 做的一个学生信息录入系统
    vue常用指令总结
    vue介绍以及相关概念理解大全
    class类
    javascript闭包详解
    前端必看网站(一直更新中)
    微信小程序wx.getUserInfo获取用户信息
    微信小程序自定义组件注意事项
    微信小程序自定义选项卡
    uni-app开发注意事项及常用样式
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421836.html
Copyright © 2011-2022 走看看