SCDL--稀疏編碼(sparse code)與字典學習(dictionary learning)

轉載自未雨愁眸  https://www.cnblogs.com/mtcnn/p/9421836.html

1. 簡介

字典 D∈RN×K(其中 K>N),共有 k 個原子,x∈RN×1 在字典 D 下的表示爲 w,則獲取較爲稀疏的 w 的稀疏逼近問題如下表示:

 

wopt=argminw∥w∥p+γ∥x−Dw∥22p∈{0,1}

 

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

  • p=0,通過 MP(matching pursuit)匹配追蹤算法求解,比如 ORMP(order recursive matching pursuit);
  • p=1,通過 LARS 算法求解;
  • ORMP 還是 LARS 均是基於貪心的思路求解;

2. 字典學習

在給定訓練集 X∈RN×L 的情況下,字典學習用來求解字典 D∈RN×K(∥di∥=1,i=1,2,…,K),及其對應的係數矩陣 W∈RK×L,此時的表示誤差爲 R=X−DW。

 

{Dopt,Wopt}=argminD,W∑ℓ=1L∥wℓ∥+γ∥X−DW∥2

 

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 分解更新 D 和 W;
    % 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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章