赞
踩
第四十五次写博客,本人数学基础不是太好,如果有幸能得到读者指正,感激不尽,希望能借此机会向大家学习。本文主要对字典学习(Dictionary Learning)进行简要介绍,并对其中较为典型的K-SVD算法进行讲解。
∣ ∣ x ∣ ∣ 0 = ||{\bf{x}}||_{0}= ∣∣x∣∣0=向量 x \bf{x} x中非零分量的数量
对于矩阵 X ∈ R m × n {\bf{X}}\in{\Bbb{R}^{m\times{n}}} X∈Rm×n, ∣ ∣ X ∣ ∣ F = ( ∑ i = 1 m ∑ j = 1 n x i j 2 ) 1 / 2 ||{\bf{X}}||_{F}=(\sum_{i=1}^{m}{\sum_{j=1}^{n}{x_{ij}^{2}}})^{1/2} ∣∣X∣∣F=(∑i=1m∑j=1nxij2)1/2,并且 ∣ ∣ X ∣ ∣ F 2 = ∑ j = 1 n ∣ ∣ x j ∣ ∣ 2 2 = ∑ i = 1 m ∣ ∣ x i ∣ ∣ 2 2 ||{\bf{X}}||_{F}^{2}=\sum_{j=1}^{n}{||{\bf{x}}^{j}||^2_2}=\sum_{i=1}^{m}{||{\bf{x}}_{i}||^2_2} ∣∣X∣∣F2=∑j=1n∣∣xj∣∣22=∑i=1m∣∣xi∣∣22,其中 x i {\bf{x}}_{i} xi和 x j {\bf{x}}^{j} xj分别为 X ∈ R m × n {\bf{X}}\in{\Bbb{R}^{m\times{n}}} X∈Rm×n的行向量和列向量。
特征选择过程可以看做是将“感兴趣”的特征以外的特征全部赋值为零,即将数据集中的某一行(列)全部置零,“稀疏表示”(sparse learning)则是将数据集对应的(稀疏编码后的)矩阵中的某些元素赋值为零,这些元素并不必须位于某一行(列)上。采用稀疏表示的优点是,对于类似支持向量机等学习器期望用于学习的数据集是线性可分的,而稀疏化后的数据集在很大程度上满足这条属性,另外,稀疏的数据集并不会造成存储上的负担,因为现在已经有很多高效的存储稀疏矩阵的方法。
对于稠密矩阵我们所期望的是对其进行“恰当稀疏”而不是“过度稀疏”,例如对于文本分类问题,如果我们使用《现代汉语大辞典》对文本进行编码,这样得到的数据集将是恰当稀疏的,但是使用《康熙字典》显然是过度稀疏的,因此,在一般的学习任务中,我们需要学习到一个可以对数据集进行恰当稀疏的“字典”,这个学习过程就被称为“字典学习”(Dictionary Learning),而之后通过该“字典”对样本进行编码的过程被称为“稀疏编码”(sparse coding)。
假设字典矩阵为 D ∈ R n × K {\bf{D}}\in{\Bbb{R}^{n\times{K}}} D∈Rn×K, K K K代表字典的词数, n n n代表原始样本的属性个数, d i {\bf{d}}_{i} di代表矩阵 D {\bf{D}} D的第 i i i列, y ∈ R n {\bf{y}}\in{\Bbb{R}^{n}} y∈Rn是原始样本, x ∈ R K {\bf{x}}\in{\Bbb{R}^{K}} x∈RK是 y {\bf{y}} y经过稀疏编码后的样本(即稀疏化样本),稀疏表示的目标是获得可以恰当表示原始样本、非零分量最少的稀疏化样本,即
min x ∣ ∣ x ∣ ∣ 0 \min_{\bf{x}}{||{\bf{x}}||_{0}} xmin∣∣x∣∣0
但是当 n < K n<K n<K且 D \bf{D} D满秩时,上式有无穷多个解,因此需要一些约束条件使得解唯一,因此,以上各个参量需要满足
(1) ( P 0 ) min x ∣ ∣ x ∣ ∣ 0 s . t . y = D x (P_0)\min_{\bf{x}}{||{\bf{x}}||_{0}} \\ s.t.\quad{\bf{y}}={\bf{D}}{\bf{x}} \tag{1} (P0)xmin∣∣x∣∣0s.t.y=Dx(1)
或者
(2) ( P 0 , ε ) min x ∣ ∣ x ∣ ∣ 0 s . t . ∣ ∣ y − D x ∣ ∣ p ≤ ε (P_{0,\varepsilon})\min_{\bf{x}}{||{\bf{x}}||_{0}} \\ s.t.\quad||{\bf{y}}-{\bf{D}}{\bf{x}}||_{p}\leq{\varepsilon} \tag{2} (P0,ε)xmin∣∣x∣∣0s.t.∣∣y−Dx∣∣p≤ε(2)
上式中 p p p常取 p = 1 , 2 , ∞ p=1,2,\infty p=1,2,∞,不过这里只关注 p = 2 p=2 p=2的情况,即
(3) ( P 0 , ε ) min x ∣ ∣ x ∣ ∣ 0 s . t . ∣ ∣ y − D x ∣ ∣ 2 ≤ ε (P_{0,\varepsilon})\min_{\bf{x}}{||{\bf{x}}||_{0}} \\ s.t.\quad||{\bf{y}}-{\bf{D}}{\bf{x}}||_{2}\leq{\varepsilon} \tag{3} (P0,ε)xmin∣∣x∣∣0s.t.∣∣y−Dx∣∣2≤ε(3)
稀疏编码广泛的应用于压缩、识别以及特征提取领域,用于求解这类问题的、最具有代表性的追踪算法(Pursuit Algorithm)【3】,通过预先假定由于编码的字典已知而且固定不变,这类方法简单可行,而且可以对稀疏编码的性能进行简单而快速的评价,实际上,他被广泛的应用在小波变换、轮廓波变换以及短时间傅里叶变换中。但是,他在很大程度上依赖于,事先确定的字典能否使得稀疏化样本恰当的表示原始样本,考虑到这个问题,我们需要一种通过不断拟合稀疏化样本来学习字典的算法。
K-SVD算法作为K-Means算法过程的泛化,是由Michal Aharon等人于2006年提出的,用于在给定训练集后,在严格的稀疏化条件(式(1)、(2))下找出一个可以恰当表示这些样本的字典,该算法是一个交替迭代更新算法,即“根据字典对每个样本重新进行稀疏编码,并且根据稀疏化样本对字典进行更新”,这样做可以加快算法收敛速度,K-SVD算法可以与追踪算法(例如Basic Pursuit、Matching Pursuit、Orthogonal Matching Pursuit、FOCUSS等)灵活结合,最终得到字典以及原始样本的恰当稀疏化样本。
“稀疏编码”(Sparse Coding)是根据原始样本 y \bf{y} y以及字典 D \bf{D} D,求得原始样本的稀疏表示 x \bf{x} x的过程,该过程类似于“原子分解”(Atom Decomposition),需要解决式(1)或(2)的优化问题,获得上述问题的精确解被证明是NP-hard的,因此经典的解法是采用可以获得近似解的“追踪算法”(Pursuit Algorithm)。
追踪算法中最简单的是Matching Pursuit(简称MP)算法和Orthogonal Matching Pursuit(简称OMP)算法,这两种算法贪婪的按顺序选择字典中的每一列,计算过程中会涉及到字典列 d i {\bf{d}}_{i} di与原始样本 y \bf{y} y的内积,并且包括最小二乘法的应用。第二个经典的追踪算法是Basic Pursuit(简称BP)算法,他通过将式(1)和(2)中的 L 0 L_0 L0正则项替换为 L 1 L_1 L
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。