当前位置:   article > 正文

KSVD-字典学习入门_字典学习代码ksvd

字典学习代码ksvd

字典学习思想

通过学习已有的文章和句子学习得到一个字典,字典的数据相比于文章句子来说更少,但是通过查阅字典,将字典里的字进行组合得到句子,得到文章。换言之,我们用更少的数据更低的维度的花销实现了更多数据更多维度的回报。
实际上字典学习实现的字典和现实中的字典还是有所不同:

  1. 字典学习的字典不需要完全的准确一摸一样的还原某个句子某篇文章,而是尽可能地逼近近似。
  2. 字典学习的字典希望查阅足够准确,也就是我们尽可能少用到字典的元素,用尽可能少的字典元素来表示某个句子某篇文章。

用数学的角度来表示:原始样本 Y Y Y即为已有的句子或者文章,字典矩阵 D D D为我们学习到的字典,尽可能的少用字典元素来组合出句子或文章即为得到一个稀疏矩阵 X X X来近似表示 Y ≈ D x Y\approx Dx YDx。而我们要做的就是

字典学习理论

相关概念

稀疏表示:假设在 H i l b e r t Hilbert Hilbert空间(简记为 H H )中字典矩阵 D = D= D={ d i ; i = 1 , 2 , 3 … , m {d_{i};i=1,2,3\dots ,m} di;i=1,2,3,m}由一组基构成,每个基 d i ∈ R n d_{i}\in \mathbb{R}^{n} diRn l 2 l^2 l2 范数下的标准形式,又称为原子。任意信号 y ∈ R n y\in \mathbb{R}^{n} yRn为 可表示为一组原子的线性组合,组合系数向量为 x ∈ R n x\in \mathbb{R}^{n} xRn,若 x x x的元素中仅有少量元素不为0,则 x x x为稀疏系数,该过程称为稀疏表示。
追踪算法:从一个随机冗余字典中寻找信号的稀疏表示是一个非确定性多项式问题(NP),一 般采用任意追踪算法即可求出稀疏系数。看作一个函数的话输入是样本 y y y和字典 D D D,输出是稀疏系数 x x x
SVD(奇异值分解):针对非方阵的矩阵而言,一个矩阵 A ∈ R m × n A\in\mathbb{R}^{m\times n} ARm×n,则
A = U Σ V T A=U\Sigma V^T A=UΣVT
其中 U ∈ R m × m U\in\mathbb{R}^{m \times m} URm×m V ∈ R n × n V\in\mathbb{R}^{n\times n} VRn×n Σ ∈ R m × n \Sigma\in\mathbb{R}^{m\times n} ΣRm×n,并且 U U U, V V V满足 U U T = I UU^T=I UUT=I, V V T = I VV^T=I VVT=I, Σ \Sigma Σ除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值。

数学模型

Y ∈ R m × n Y\in \mathbb{R}^{m\times n} YRm×n作为原始样本,我们的目的是寻找一个字典矩阵 D ∈ R m × k D\in \mathbb{R}^{m\times k} DRm×k以及一个稀疏矩阵 X ∈ R n × k X\in \mathbb{R}^{n \times k} XRn×k使得 Y ≈ D X Y\approx DX YDX
转化为优化问题的形式为:
min ⁡ D , X ∣ ∣ Y − D X ∣ ∣ F 2 \min\limits_{D,X}\vert\vert Y-DX\rvert\rvert_F^2 D,Xmin∣∣YDXF2
min ⁡ X ∣ ∣ X ∣ ∣ 0 \min\limits_{X}\vert\vert X\rvert\rvert_0 Xmin∣∣X0
即最小化 Y Y Y D X DX DX乘积之间的差距,同时我们希望 X X X能够尽量稀疏(拥有尽量少的非零元素)
一般这两个问题是有所矛盾的,即不能同时取得最优解,同时他们也被证明是一个NP-hard问题。
上述问题在实际中又被转化为另外的形式以满足不同实际问题。在满足一定稀疏度的条件下近似以及在满足一定相似性的情况下尽量稀疏。
形式一:
min ⁡ D , X ∣ ∣ Y − D X ∣ ∣ F 2             s . j     t o    ∣ ∣ X ∣ ∣ 0 < A \min\limits_{D,X}{\vert\vert Y-DX\rvert\rvert_F^2}\ \ \ \ \ \ \ \ \ \ \ s.j\ \ \ to\ \ \vert\vert X\rvert\rvert_0<A D,Xmin∣∣YDXF2           s.j   to  ∣∣X0<A
形式二: min ⁡ X ∣ ∣ X ∣ ∣ 0            s . j     t o     ∣ ∣ Y − D X ∣ ∣ F 2 < ϵ \min\limits_{X}\vert\vert X\rvert\rvert_0\ \ \ \ \ \ \ \ \ \ s.j\ \ \ to\ \ \ \vert\vert Y-DX\rvert\rvert_F^2<\epsilon Xmin∣∣X0          s.j   to   ∣∣YDXF2<ϵ
在实际解决问题时我们一般以形式一来进行处理(假设稀疏度 A A A已经选定)。

求解方法

对于字典学习的求解是一个迭代过程,目前应用广泛且非常有效的一种字典迭代方法是 K − S V D K-SVD KSVD算法。
以形式二的优化问题来看,我们的目的就是稀疏码矩阵比较稀疏的情况下,追求 D X DX DX Y Y Y差值的二范数最小,得到此时的字典 D D D和稀疏向量 X X X。具体来求解则是通过对字典的每一列和稀疏向量的每一行通过目标函数来进行迭代更新。
假设字典和稀疏向量已经初始化, Y Y Y m × n m\times n m×n维的矩阵, D D D m × s m\times s m×s维的矩阵, X X X s × n s\times n s×n的矩阵。我们正在更新字典矩阵的第 k k k列和稀疏向量矩阵的第 k k k行,分别用 d k d_k dk x T k x _T^k xTk来表示字典矩阵的第 k k k列和稀疏向量矩阵的第 k k k行。

∣ ∣ Y − D X ∣ ∣ F 2 = ∣ ∣ Y − ∑ i = 1 s d i x T i ∣ ∣ F 2 {\vert\vert Y-DX\rvert\rvert_F^2}={\vert\vert Y-\sum_{i=1}^sd_ix_T^i\rvert\rvert_F^2} ∣∣YDXF2=∣∣Yi=1sdixTiF2

                        = ∣ ∣ Y − ∑ i = 1 s d i x T i ∣ ∣ F 2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ={\vert\vert Y-\sum_{i=1}^sd_ix_T^i\rvert\rvert_F^2}                        =∣∣Yi=1sdixTiF2

                        = ∣ ∣ Y − ∑ i ≠ k d i x T i − d k x T k ∣ ∣ F 2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ={\vert\vert Y-\sum_{i\neq k}d_ix_T^i-d_kx_T^k\rvert\rvert_F^2}                        =∣∣Yi=kdixTidkxTkF2

                        = ∣ ∣ ( Y − ∑ i ≠ k d i x T i ) − d k x T k ∣ ∣ F 2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\vert\vert( Y-\sum_{i\neq k}d_ix_T^i)-d_kx_T^k\rvert\rvert_F^2                        =∣∣(Yi=kdixTi)dkxTkF2

                        = ∣ ∣ E k − d k x T k ∣ ∣ F 2 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ =\vert\vert E_k-d_kx_T^k\rvert\rvert_F^2                        =∣∣EkdkxTkF2

此时优化目标即为 ∣ ∣ E k − d k x T k ∣ ∣ F 2 \vert\vert E_k-d_kx_T^k\rvert\rvert_F^2 ∣∣EkdkxTkF2,第一项为 m × n m\times n m×n维的矩阵,第二也为 m × n m\times n m×n维的矩阵,第一项表示原始样本 Y Y Y与除了我们要更新的字典列和稀疏向量行乘积之外其他字典和稀疏向量乘积之间的差异,认为是固定不变,而我们目标是想通过更新 d k d_k dk x T k x_T^k xTk来弥补这个差异,当然不可能完全弥补只能减小。

这里有一个关键点,那就是我们并非直接更新 d k d_k dk x T k x_T^k xTk,因为这样会带来一个问题,那就是我们稀疏向量的稀疏性得不到保证,即更新完之后,我们的 x T k x_T^k xTk中的非零元素可能增加可能减少,哪怕减少,再下一次大的更新迭代过程中,因为其他行列的更新, E k E_k Ek的变化无法预测,再次更新这一行时,非零元素个数可能会增多,因此我们必须保证更新后 x T k x_T^k xTk中的非零元素减少或者不变。

因此我们采取这样的策略,对于 x T k x_T^k xTk这一行,我们只更新其非零元素,保证他的稀疏性只会不变或者更稀疏。具体实现是把 x T k x_T^k xTk这一行的非零元素提取出来,构成新的行向量 x T ′ k x^{'k}_T xTk,同时把对应位置的 E k E_k Ek的列向量提取出来,构成新的矩阵 E k ′ E_k^{'} Ek,满足 E k ′ E_k^{'} Ek d k x T ′ k d_kx^{'k}_T dkxTk的维度一致
保证X稀疏性的做法
以上图为例,即把 x T k x_T^k xTk的红色选定部分(值为0)剔除,把对应位置 E k E_k Ek的列全部剔除,得到 E k ′ E_k^{'} Ek

此时我们的优化目标变成了:
min ⁡ d k , x T ′ k ∣ ∣ E k ′ − d k x T ′ k ∣ ∣ F 2 \min\limits_{d_k,x^{'k}_T}\vert\vert E^{'}_{k}-d_kx_T^{'k}\rvert\rvert_F^2 dk,xTkmin∣∣EkdkxTkF2这是一个最小二乘问题,可以利用最小二乘的方法求解,或者可以利用SVD进行求解,诚如这篇文章的标题,我们肯定是采用svd进行求解。
我们将 E k ′ E^{'}_k Ek进行奇异值分解得到:
E k ′ = U Σ V T E_k^{'}=U\Sigma V^T Ek=UΣVT
分解后 Σ \Sigma Σ表示奇异值,是一个 m × s m\times s m×s维的矩阵,其除主对角线元素外其他位置均为零,且从大到小依次排序,我们令这些元素为 σ i \sigma_i σi,同时令 U U U矩阵的每一列为 u i u_i ui V T V^T VT矩阵的每一行为 v i v_i vi
则又可以写作:
E k ′ = U Σ V T = u 1 σ 1 v 1 + u 2 σ 2 v 2 + u 3 σ 3 v 3 … E_k^{'}=U\Sigma V^T=u_1\sigma_1v_1+u_2\sigma_2v_2+u_3\sigma_3v_3\dots Ek=UΣVT=u1σ1v1+u2σ2v2+u3σ3v3
其中 σ 1 > σ 2 > σ 3 … \sigma_1>\sigma_2>\sigma_3\dots σ1>σ2>σ3
因为 U U U, V V V满足 U U T = I UU^T=I UUT=I, V V T = I VV^T=I VVT=I,所以当我们对 E k ′ E_k^{'} Ek F F F范数平方时其值为1:
∣ ∣ E k ′ ∣ ∣ F 2 = σ 1 2 + σ 2 2 + σ 3 2 + … \vert\vert E_k^{'}\rvert\rvert_F^2=\sigma^2_1+\sigma^2_2+\sigma^2_3+\dots ∣∣EkF2=σ12+σ22+σ32+
σ 1 2 \sigma_1^2 σ12的能量占据了 E k ′ E_k^{'} Ek能量的一大部分,所以我们选择用它所在的矩阵来对 d k d_k dk x T ′ k x_T^{'k} xTk进行更新,从而逼近 E k ′ E_k^{'} Ek,因为还存在其他奇异值,所以只能是逼近。

具体操作是,令 d i = u 1 d_i=u_1 di=u1 x T ′ k = σ 1 v 1 x_T^{'k}=\sigma_1v_1 xTk=σ1v1。然后再对 x T k x_T^{k} xTk进行更新。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/551049
推荐阅读
相关标签
  

闽ICP备14008679号