K-SVD

来源:互联网 发布:中国电信盒子安装软件 编辑:程序博客网 时间:2024/05/14 08:50

参考网址:http://en.wikipedia.org/wiki/K-SVD

     K-SVD 是一种关于稀疏表示的字典学习算法。之所以称之为K-SVD ,是因为该算法K次迭代使用SVD(singular value decomposition)。K-SVD是 k-means的一种推广,该算法采用迭代交替学习方式,通过迭代优化输入数据在当前字典的表示和更新字典中的单词(atom)以更好地拟合数据1][2] 。 K-SVD在图像处理、语音处理、生物和文件分析等众多领域被广泛应用。

稀疏表示问题描述

        给定一个过完备的字典D \in \mathbb{R}^{n \times K},该字典包含K个单词,在此每一列都被视作一个单词。一个信号y \in \mathbb{R}^{n} 能够被表示为这些单词的线性组合。为表示y,稀疏表示 x 应当满足精确条件 y = Dx, 或者满足近似条件y \approx Dx, 或者满足条件 \|y - Dx\|_p \le  \epsilon. 向量 x \in \mathbb{R}^{K} 由表示y的系数组成. 通常来说, 范数 p 可以选为L1L2, 或者 L .

如果n < K 并且 D 是满秩矩阵,那么稀疏表示问题的解为有限个,因此,应当对解设置一定的条件。并且,为保证稀疏性,含有最少非零元素的解是我们更想得到的。我们的目的是在当前字典的基础上,用最少的非零元素表示所有的样本。因此,稀疏表示是问题

 (P_0)  \quad  \min \limits _x \|x\|_0  \qquad \text{subject to } y = Dx

或者问题

 (P_{0, \epsilon})  \quad  \min \limits _x \|x\|_0 \qquad  \text{subject to } \|y - Dx\|_2 \le \epsilon

的解。在此, L_0范数是向量中非零元素的个数. (具体可参考矩阵范数Matrix norm)。

K-SVD 算法

K-SVD 是 K-means的一种泛化。稀疏表示的目的是用少数的几个单词来表示一个样本,K-means只用一个单词表示一个样本(K-means的中心为单词。因此.  k-means能够被视作 sparse representation的一种方法. 这就是, 通过最近邻(nearest neighbor)寻找最好的可能码本表示数据样本 \{y_i\}^M_{i=1} 。 通过解决问题

 \quad  \min \limits _{D, X}  \{ \|Y - DX\|^2_F\} \qquad \text{subject to } \forall i, x_i = e_k \text{ for some } k.

该问题可以改写为

 \quad  \min \limits _{D, X} \{ \|Y - DX\|^2_F\} \qquad \text{subject to }\quad \forall i ,  \|x_i\|_0 = 1.

稀疏表示项 x_i = e_k 使K-means 算法仅用字典中的一个单词(一列)来表示样本x_i。为松弛这个条件, K-SVD 算法的目标是将信号表示为字典中单词的线性组合。 

K-SVD 算法遵循K-means的类似条件。然而, 和 K-means不同的是, 为表示为字典D的线性组合,稀疏项的条件放宽到每列x_i的非零元素数目可以大于1,但是少于T_0。因此,目标函数变为

 \quad  \min \limits _{D, X} \{ \|Y - DX\|^2_F \} \qquad \text{subject to } \quad \forall i \;,  \|x_i\|_0 \le T_0.

或者另一种形式

 \quad  \min \limits _{D, X}  \sum_{i} \|x_i\|_0  \qquad \text{subject to } \quad \forall i \;,  \|Y - DX\|^2_F \le \epsilon.

 K-SVD算法中,首先固定字典D求最佳的系数矩阵 X。 因为找到最优的真值X 是不可能的, 我们采取近似追踪(approximation pursuit)的方法。给定字典D和阈值T_0,如OMP(the orthogonal matching pursuit)可以用来计算系数。

在 sparse coding 任务之后,下一步是寻找更优的字典 D。然而, 一次求解整个字典不大可能,因此在该过程中每次仅更新字典D 的一列(一个单词),在X固定的情况下. 第k个列的更新通过求解如下被改写的惩罚项:

\|Y - DX\|^2_F =  \left| Y - \sum_{j = 1}^K d_j x^j_T\right|^2_F = \left| \left(Y - \sum_{j \ne k} d_j x^j_T \right)  -  d_k x^k_T) \right|^2_F = \| E_k - d_k x^k_T\|^2_F

在此,x^k_T 代表矩阵X的第k行.

通过将乘积 DX分解为 K 个秩为 1 的矩阵(矩阵乘积的秩小于或等于两个因子的秩), 我们可以假设 第k个未知,其余 K-1 项固定。 这步后,我们可以解最小化问题通过采用奇异值分解(singular value decomposition)用一个秩为 rank -1的矩阵近似E_k,然后更新d_k。 然而, 新的解向量 x^k_T 很可能不是稀疏的, 因为我们在此并未强加稀疏约束。为解决此问题,我们定义 \omega_k  

\omega_k = \{i \mid 1 \le i \le N , x^k_T(i) \ne 0\}.

 \omega_k 对应使用了单词d_k样本 \{ y_i \}  (即 x_i 对应d_k的元素非0). 接着, 我们定义\Omega_k 为大小N\times|\omega_k|的矩阵, 该矩阵在( i\text{-th}, \omega_k(i))  处元素为1,其余元素为0。做右乘 x_R^k = x^k_T\Omega_k, 可以将行向量 x_T^k 中的非0元素去掉。类似地, 乘积 Y^R_k = Y\Omega_k 表示样本集中使用了单词d_k 表示的样本子集。 同理,我们可以得到E^R_k = E_k\Omega_k

因此,以上的最小化问题可以变为

 \| E_k\Omega_k - d_k x^k_T\Omega_k\|^2_F =  \| E^R_k - d_k x^k_R\|^2_F

熟悉PCA的朋友可以看到,该最小化问题本质上就是一个PCA问题。即用一个基向量d_k表示当前所有的样本,误差最小。该问题可以直接用SVD解。 SVD 算法将矩阵 E^R_k 分解为  U\Delta V^T。 d_k 的解为矩阵 U的第一个列向量, 系数向量 x^k_R 的解为矩阵 V \times \Delta (1, 1)的第一列。 在更新完整个字典后, K-SVD算法又转向更新 X, 然后再迭代优化字典.

局限性

为数据集选择字典是一个非凸的问题, K-SVD算法通过迭代优化并不能保证结果全局最优。[2]然而,这对使用迭代优化的算法很常见, 并且K-SVD算法在实际应用中效果很不错 .[2]



参考文献:

  1.  Michal Aharon, Michael Elad, and Alfred Bruckstein (2006), "K-SVD: An Algorithm for Designing Overcomplete Dictionaries for Sparse Representation", IEEE Transactions on Signal Processing 54 (11): 4311–4322, doi:10.1109/TSP.2006.881199
  2. Jump up to:a b c Rubinstein, R., Bruckstein, A.M., and Elad, M. (2010), "Dictionaries for Sparse Representation Modeling", Proceedings of the IEEE 98 (6): 1045–1057,doi:10.1109/JPROC.2010.2040551

0 0